From 5aa17522b04796cf919e4475cdd723b1ef842e50 Mon Sep 17 00:00:00 2001 From: Do Nhat Minh Date: Thu, 16 Feb 2012 22:11:12 +0800 Subject: [PATCH] working sub --- bigint.c | 35 ++++++++++++++++++++++++++++++++++- driver.c | 16 +++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/bigint.c b/bigint.c index 63982c8..6d0de71 100644 --- a/bigint.c +++ b/bigint.c @@ -119,7 +119,40 @@ bigint *bi_sub(bigint *a, bigint *b) { int sa = a->size, sb = b->size; int *na = a->n, - *nb = a->n; + *nb = b->n; + bigint *retval = bi_create((sa < sb) ? sb : sa); + if (retval == NULL) + return NULL; + int *n = retval->n; + int biggersize = retval->size; + int *bigger = ((sa > sb) > 0) ? na : nb; + int tmp = 0, + carry = 0; + int i; + for (i = 0; i < sa && i < sb; i++) { + if (na[i] < nb[i] + carry) { + n[i] = MAXD + na[i] - nb[i] - carry; + carry = 1; + } + else { + n[i] = na[i] - nb[i] - carry; + carry = 0; + } + /* printf("na[%d]=%d\n", i, na[i]); + printf("nb[%d]=%d\n", i, nb[i]); + printf("n[%d]=%d\n", i, n[i]);*/ + } + while (carry != 0 && i < biggersize) { + if (bigger[i] < carry) + n[i] = MAXD - 1; + else { + n[i] = bigger[i] - carry; + carry = 0; + } + // printf("n[%d]=%d\n", i, n[i]); + i++; + } + return retval; } bigint *bi_mult(bigint *a, bigint *b) { diff --git a/driver.c b/driver.c index d20fd70..6c0e11d 100644 --- a/driver.c +++ b/driver.c @@ -84,7 +84,7 @@ int main(int argc, char *argv[]) { // test 8 a = bi_createfromint(MAXD); - b = bi_createfromint(MAXD); + b = bi_createfromint(MAXD + 5); bi_print(a); printf(" + "); bi_print(b); @@ -96,5 +96,19 @@ int main(int argc, char *argv[]) { bi_delete(b); bi_delete(c); + // test 8 + a = bi_createfromint(MAXD); + b = bi_createfromint(5); + bi_print(a); + printf(" - "); + bi_print(b); + printf(" is "); + c = bi_sub(a, b); + bi_print(c); + printf("\n"); + bi_delete(a); + bi_delete(b); + bi_delete(c); + return 0; }