hmm i did have it fixed in mine, but thanks for the catch lol;
Code:
//Jason Shih
//Big Integers
//January 25, 2010
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 201
struct integer {
int* digits;
int size;
};
struct integer* read_integer(char* stringInt);
void print(struct integer *p);
struct integer* add(struct integer *p, struct integer *q);
struct integer* subtract(struct integer *p, struct integer *q);
int compare(struct integer *p, struct integer *q);
int main() {
FILE *read;
char string_one[MAX_LEN], string_two[MAX_LEN];
int steps, i, operation;
struct integer *p;
struct integer *q;
struct integer *ans;
read=fopen("bigint.txt","r");
fscanf(read,"%d",&steps);
for(i=0;i<steps;i++) {
printf("i = %d, step=%d\n", i, steps);
fscanf(read,"%d%s%s",&operation,string_one,string_two);
p=read_integer(string_one);
q=read_integer(string_two);
//print addition equation
if(operation==1) {
print(p);
printf("+");
print(q);
printf("= ");
ans=add(p,q);
print(ans);
printf("\n");
system("PAUSE");
}
else {
//print subtraction equation
if(compare(p,q)==1) {
print(p);
printf("-");
print(q);
printf("= ");
}
else {
print(q);
printf("-");
print(p);
printf("= ");
}
ans=subtract(p,q);
print(ans);
printf("\n");
}
free(p->digits);
free(p);
free(q->digits);
free(q);
free(ans->digits);
free(ans);
}
fclose(read);
system("PAUSE");
return 0;
}
//create an integer using a string of ints
struct integer* read_integer(char* stringInt) {
struct integer* c;
int string_size=strlen(stringInt);
c = (struct integer*)malloc(sizeof(struct integer));
c->size=string_size;
c->digits=(int*)malloc(sizeof(int)*c->size);
int i;
for(i=0;i<string_size;i++) {
c->digits[i]=stringInt[string_size-1-i]-'0';
}
return c;
}
//prints integer in correct direction
void print(struct integer *p) {
int i;
for(i=p->size-1;i>=0;i--) {
printf("%d",p->digits[i]);
}
}
//make integer c same size as bigger integer p or q; then add them together
//and return c;
struct integer* add(struct integer *p, struct integer *q) {
struct integer* c;
struct integer* bigger;
//trying to make it bigger so it can store that extra digit
c=(struct integer*)malloc(sizeof(struct integer));
int comp=compare(p,q);
if(comp>=0)
c->size=p->size;
else
c->size=q->size;
int i=0;
//c->size++;
//c->digits=realloc(c->digits,c->size);
for(i=0;i<c->size;i++) {
if(p->digits[i]+q->digits[i]<10)
c->digits[i]=p->digits[i]+q->digits[i];
//result>10 so carry over to the next digit
else {
int temp=p->digits[i]+q->digits[i];
temp %=10;
c->digits[i]=temp;
//attempt at solving the carry problem
c->digits[i+1]=p->digits[i+1]+q->digits[i+1]+1;
i++;
//sequence checker
printf("\n\n");
print(p);
printf("\n\n");
print(q);
printf("\n\n");
printf("%d",c->digits[i]);
}
}
printf("\n");
printf("\n");
return c;
}
//find which is bigger, then subtract the smaller one from the bigger one
struct integer* subtract(struct integer *p, struct integer *q) {
struct integer* c;
c=(struct integer*) malloc(sizeof(struct integer));
int i;
int comp=compare(p,q);
//whichever one is bigger is the one subtracted from;
//same operation;
if(comp==1) {
c->size=p->size;
for(i=0;i<c->size;i++) {
if(p->digits[i]>q->digits[i])
c->digits[i]=p->digits[i]-q->digits[i];
else if(p->digits[i]<q->digits[i]) {
c->digits[i]=q->digits[i]-p->digits[i];
p->digits[i]-=1;
}
}
}
else if(comp==-1) {
c->size=q->size;
for(i=0;i<c->size;i++) {
if(q->digits[i]>p->digits[i])
c->digits[i]=q->digits[i]-p->digits[i];
else if(q->digits<p->digits[i]) {
c->digits[i]=p->digits[i]-q->digits[i];
q->digits[i]-=1;
}
}
}
else {
c->size=0;
c->digits=0;
}
return c;
}
//return 1 if p>q, 0 if p==q, -1 if p<q
int compare(struct integer *p, struct integer *q) {
//check to see which one is bigger;
if(p->size>q->size)
return 1;
else if(p->size<q->size)
return -1;
//if equal sizes, check to see which digits are bigger from the
//more important digits
else {
int i;
for(i=q->size;i>0;i++) {
if(p->digits[i]>q->digits[i])
return 1;
else if(p->digits[i]<q->digits[i])
return -1;
}
}
return 0;
}