Skip to content

Commit

Permalink
working add
Browse files Browse the repository at this point in the history
  • Loading branch information
Do Nhat Minh committed Feb 16, 2012
1 parent c7d0913 commit cc36d1b
Show file tree
Hide file tree
Showing 3 changed files with 172 additions and 49 deletions.
120 changes: 76 additions & 44 deletions bigint.c
@@ -1,25 +1,39 @@
#include "bigint.h"

const unsigned int MAXD = (unsigned int) -1;
const int MAXD = 1000000000;

struct bigint {
int size;
int *n;
};

bigint *bi_create(int size) {
bigint *bi_create(int dplace) {
int size = dplace / 9 + ((dplace % 9 != 0) ? 1 : 0);
if (size <= 0)
return NULL;
bigint *retval = malloc(sizeof(bigint));
if (retval == NULL)
return NULL;
retval->size = size;
retval->n = malloc(size*sizeof(unsigned int));
retval->n = malloc(size*sizeof(int));
if (retval->n == NULL) {
free(retval);
return NULL;
}
memset(retval->n, 0, size*sizeof(unsigned int));
memset(retval->n, 0, size*sizeof(int));
return retval;
}

bigint *bi_createfromint(int n) {
bigint *retval = bi_create(10);
if (retval == NULL)
return NULL;
if (n >= MAXD) {
retval->n[0] = n % MAXD;
retval->n[1] = n / MAXD;
}
else
retval->n[0] = n;
return retval;
}

Expand All @@ -28,70 +42,88 @@ void bi_delete(bigint *a) {
free(a);
}

void bi_print(bigint *a) {
int *n = a->n;
int printed = 0;
int i;
// printf("a->size=%d\n", a->size);
for (i = a->size - 1; i >= 0; i--) {
if (n[i] != 0) {
if (!printed)
printf("%d", n[i]);
else
printf("%09d", n[i]);
printed = 1;
}
else if (printed) {
printf("%09d", 0);
}
}
if (!printed)
printf("0");
}

int bi_cmp(bigint *a, bigint *b) {
int *arr[2] = {a->n, b->n};
int bigger = (a->size > b->size) ? a->size : b->size;
int which = (a->size > b->size) ? 0 : 1;
if (a->size < b->size)
return bi_cmp(b, a);
int i;
for (i = 0; i < a->size && i < b->size; i++) {
if (a->n[i] != b->n[i])
return a->n[i] - b->n[i];
int retval = 0;
for (i = 0; i < b->size; i++) {
if (a->n[i] != b->n[i]) {
retval = a->n[i] - b->n[i];
}
}
for (; i < bigger; i++) {
if (arr[which][i] != 0)
return (which == 0) ? 1 : -1;
if (retval > 0)
return 1;
for (; i < a->size; i++) {
if (a->n[i] != 0)
return 1;
}
return 0;
return retval;
}

bigint *bi_add(bigint *a, bigint *b) {
if (a->size < b->size)
return bi_add(b, a);
int sa = a->size,
sb = b->size,
bigger = (sa < sb) ? sb : sa;
int which = (sa < sb) ? 1 : 0;
sb = b->size;
int *na = a->n,
*nb = b->n;
int *arr[2] = {na, nb};
bigint *retval = bi_create(bigger + 1);
bigint *retval = bi_create(sa*9 + 1);
if (retval == NULL)
return NULL;
int *n = retval->n;
long long carry = 0;
long long tmp = 0;
int carry = 0;
int tmp = 0;
int i;
// whole number adding
// per "digit" adding
for (i = 0; i < sa && i < sb; i++) {
for (i = 0; i < sb; i++) {
tmp = na[i] + nb[i] + carry;
if (tmp > MAXD) {
n[i] = MAXD;
carry = tmp - MAXD;
}
else {
n[i] = tmp;
carry = 0;
}
n[i] = tmp % MAXD;
carry = tmp / MAXD;
// printf("carry = %d, n[%d]=%d\n", carry, i, n[i]);
}
while (carry != 0 && i < bigger) {
tmp = arr[which][i] + carry;
if (tmp > MAXD) {
carry = tmp - MAXD;
n[i] = MAXD;
}
else {
n[i] = tmp;
carry = 0;
}
while (carry != 0 && i < sa) {
tmp = na[i] + carry;
n[i] = tmp % MAXD;
carry = tmp / MAXD;
i++;
}
return retval;
}

bigint *bi_sub(bigint *a, bigint *b) {
if (bi_cmp(a, b) < 0)
return bi_create(1);
int sa = a->size,
sb = b->size;
int *na = a->n,
*nb = a->n;
}

bigint *bi_mult(bigint *a, bigint *b) {
bigint *retval = bi_create(a->size + b->size);
if (retval == NULL)
return NULL;
}

bigint *bi_sub(bigint *a, bigint *b) {
ASSERT(bi_cmp(a, b) >= 0);
}
5 changes: 4 additions & 1 deletion bigint.h
@@ -1,11 +1,14 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern const unsigned int MAXD;
extern const int MAXD;

typedef struct bigint bigint;

bigint *bi_create(int);
bigint *bi_createfromint(int);
void bi_delete(bigint *);
void bi_print(bigint *);
bigint *bi_add(bigint *, bigint *);
bigint *bi_sub(bigint *, bigint *);
96 changes: 92 additions & 4 deletions driver.c
Expand Up @@ -2,11 +2,99 @@
#include "bigint.h"

int main(int argc, char *argv[]) {
bigint *a, *b;
a = bi_create(32);
b = bi_create(32);
printf("%d\n", bi_cmp(a, b));
bigint *a, *b, *c;

// test 1
a = bi_createfromint(32);
b = bi_createfromint(32);
bi_print(a);
printf(" cmp ");
bi_print(b);
printf(" is %d\n", bi_cmp(a, b));
bi_delete(a);
bi_delete(b);

// test 2
a = bi_createfromint(32);
b = bi_createfromint(31);
bi_print(a);
printf(" cmp ");
bi_print(b);
printf(" is %d\n", bi_cmp(a, b));
bi_delete(a);
bi_delete(b);

// test 3
a = bi_createfromint(32);
b = bi_createfromint(39);
bi_print(a);
printf(" cmp ");
bi_print(b);
printf(" is %d\n", bi_cmp(a, b));
bi_delete(a);
bi_delete(b);

// test 4
a = bi_createfromint(MAXD + 10);
b = bi_createfromint(MAXD + 5);
bi_print(a);
printf(" cmp ");
bi_print(b);
printf(" is %d\n", bi_cmp(a, b));
bi_delete(a);
bi_delete(b);

// test 5
a = bi_createfromint(10);
b = bi_createfromint(MAXD + 5);
bi_print(a);
printf(" cmp ");
bi_print(b);
printf(" is %d\n", bi_cmp(a, b));
bi_delete(a);
bi_delete(b);

// test 6
a = bi_createfromint(32);
b = bi_createfromint(39);
bi_print(a);
printf(" + ");
bi_print(b);
printf(" is ");
c = bi_add(a, b);
bi_print(c);
printf("\n");
bi_delete(a);
bi_delete(b);
bi_delete(c);

// test 7
a = bi_createfromint(5);
b = bi_createfromint(MAXD);
bi_print(a);
printf(" + ");
bi_print(b);
printf(" is ");
c = bi_add(a, b);
bi_print(c);
printf("\n");
bi_delete(a);
bi_delete(b);
bi_delete(c);

// test 8
a = bi_createfromint(MAXD);
b = bi_createfromint(MAXD);
bi_print(a);
printf(" + ");
bi_print(b);
printf(" is ");
c = bi_add(a, b);
bi_print(c);
printf("\n");
bi_delete(a);
bi_delete(b);
bi_delete(c);

return 0;
}

0 comments on commit cc36d1b

Please sign in to comment.