I wrote this program to calculate addtition and subtraction of two large numbers (maximum 100 digit)
it won't work for minus numbers :(
i know it have problems but i couldn't fix them,please help me for fixing this :)

``````#include <stdio.h>
#include <stdlib.h>

int main()
{
int i,d=0,la,lb,max,ia,ib,ix,iy;
char a[100],b[100],pos[101],neg[101],x[100],y[100];
printf("Enter First Number: \n");
scanf("%s",a);
printf("Enter Second Number: \n");
scanf("%s",b);
for(i=0;a[i]!='\0';i++)
x[i]=a[i];
x[i]='\0';
for(i=0;b[i]!='\0';i++)
y[i]=b[i];
y[i]='\0';
for(i=0; a[i]!='\0';i++);
la=i;
for(i=0; b[i]!='\0';i++);
lb=i;
if(la>lb)
max=la;
else
max=lb;
ia=la-1;
ib=lb-1;
ix=ia;
iy=ib;
for(i=max;i>=0;i--)
{
if(ia==-1)
{
ia=0;
a[ia]='0';
}
if(ib==-1)
{
ib=0;
b[ib]='0';
}
pos[i]=((a[ia]-48)+(b[ib]-48)+d)%10;
d=((a[ia]-48)+(b[ib]-48)+d)/10;
ia--;
ib--;
}
printf("a+b=");
if(pos[0]!=0)
for(i=0;i<=max;i++)
{
printf("%d",pos[i]);
}
else if(pos[0]==0)
for(i=1;i<=max;i++)
{
printf("%d",pos[i]);
}
printf("\n");
for(i=max;i>=0;i--)
{
if(ix==-1)
{
ix=0;
x[ix]='0';
}
if(iy==-1)
{
iy=0;
y[iy]='0';
}
if((x[ix]-48)-(y[iy]-48)<0)
{
x[ix]+=10;
x[ix-1]-1;
neg[i]=(x[ix]-48)-(y[iy]-48);
ix--;
iy--;
}
else
{
neg[i]=(x[ix]-48)-(y[iy]-48);
ix--;
iy--;
}
}
printf("a-b=");
if(pos[0]!=0)
for(i=0;i<=max;i++)
printf("%d",neg[i]);
else if(pos[0]==0)
for(i=1;i<=max;i++)
printf("%d",neg[i]);
return 0;
}
``````

Arbitrary precision math. An interesting problem. Look at the source code for the Boost libraries. I worked on this about 30 years ago and gave up for lack of time (ie, I got a job).

Figured it myself :|

``````#include <stdio.h>
#include <stdlib.h>

int main()
{
int i,d=0,la,lb,max,ia,ib,ix,iy,m,ic,iv;
char a[100],b[100],pos[101],neg[101],x[100],y[100],c[100],v[100];
printf("Enter First Number: \n");
scanf("%s",a);
printf("Enter Second Number: \n");
scanf("%s",b);
for(i=0;a[i]!='\0';i++)
{
x[i]=a[i];
c[i]=a[i];
}
x[i]='\0';
c[i]='\0';
for(i=0;b[i]!='\0';i++)
{
y[i]=b[i];
v[i]=b[i];
}
y[i]='\0';
v[i]='\0';
for(i=0; a[i]!='\0';i++);
la=i;
for(i=0; b[i]!='\0';i++);
lb=i;
if(a[0]=='-')
la--;
if(b[0]=='-')
lb--;
if(la>lb)
max=la;
else
max=lb;
ia=la-1;
ib=lb-1;
ix=ia;
iy=ib;
ic=ia;
iv=ib;

//Removing Minus from Negative Numbers

if(a[0]=='-')
{
for(i=0;i<=la;i++)
{
x[i]=x[i+1];
c[i]=c[i+1];
}
}
if(b[0]=='-')
{
for(i=0;i<=lb;i++)
{
y[i]=y[i+1];
v[i]=v[i+1];
}
}

//which number is bigger?!
if(la>lb)
m=1;
else if(lb>la)
m=2;
else if(la==lb)
{
for(i=0;i<max;i++)
if(x[i]!=y[i])
break;
if(x[i]>y[i])
m=1;
else
m=2;
}

//Both Positive
if(a[0]!='-'&&b[0]!='-')
{
for(i=max;i>=0;i--)
{
if(ic==-1)
{
ic=0;
c[ic]='0';
}
if(iv==-1)
{
iv=0;
v[iv]='0';
}
pos[i]=((c[ic]-48)+(v[iv]-48)+d)%10;
d=((c[ic]-48)+(v[iv]-48)+d)/10;
ic--;
iv--;
}
printf("a+b=");
if(pos[0]!=0)
for(i=0;i<=max;i++)
{
printf("%d",pos[i]);
}
else if(pos[0]==0)
for(i=1;i<=max;i++)
{
printf("%d",pos[i]);
}
printf("\n");
}

//Both Negative
if(a[0]=='-'&&b[0]=='-')
{
for(i=max;i>=0;i--)
{
if(ic==-1)
{
ic=0;
c[ic]='0';
}
if(iv==-1)
{
iv=0;
v[iv]='0';
}
pos[i]=((c[ic]-48)+(v[iv]-48)+d)%10;
d=((c[ic]-48)+(v[iv]-48)+d)/10;
ic--;
iv--;
}
printf("a+b=-");
if(pos[0]!=0)
for(i=0;i<=max;i++)
{
printf("%d",pos[i]);
}
else if(pos[0]==0)
for(i=1;i<=max;i++)
{
printf("%d",pos[i]);
}
printf("\n");
}

//one Negative other Positive
if(a[0]=='-'&&b[0]!='-'||a[0]!='-'&&b[0]=='-')
{
if(m==1)
{
for(i=max;i>=0;i--)
{
if(ic==-1)
{
ic=0;
c[ic]='0';
}
if(iv==-1)
{
iv=0;
v[iv]='0';
}
if((c[ic]-48)-(v[iv]-48)<0)
{
c[ic]+=10;
c[ic-1]-=1;
pos[i]=(c[ic]-48)-(v[iv]-48);
ic--;
iv--;
}
else
{
pos[i]=(c[ic]-48)-(v[iv]-48);
ic--;
iv--;
}
}
if(a[0]!='-')
{
printf("a+b=");
if(pos[0]!=0)
for(i=0;i<=max;i++)
printf("%d",pos[i]);
else if(pos[0]==0)
for(i=1;i<=max;i++)
printf("%d",pos[i]);
printf("\n");
}
else
{
printf("a+b=-");
if(pos[0]!=0)
for(i=0;i<=max;i++)
printf("%d",pos[i]);
else if(pos[0]==0)
for(i=1;i<=max;i++)
printf("%d",pos[i]);
printf("\n");
}
}
else if(m==2)
{
for(i=max;i>=0;i--)
{
if(ic==-1)
{
ic=0;
c[ic]='0';
}
if(iv==-1)
{
iv=0;
v[iv]='0';
}
if((v[iv]-48)-(c[ic]-48)<0)
{
v[iv]+=10;
v[iv-1]-=1;
pos[i]=(v[iv]-48)-(c[ic]-48);
ic--;
iv--;
}
else
{
pos[i]=(v[iv]-48)-(c[ic]-48);
ic--;
iv--;
}
}
if(b[0]!='-')
{
printf("a+b=");
if(pos[0]!=0)
for(i=0;i<=max;i++)
printf("%d",pos[i]);
else if(pos[0]==0)
for(i=1;i<=max;i++)
printf("%d",pos[i]);
printf("\n");
}
else
{
printf("a+b=-");
if(pos[0]!=0)
for(i=0;i<=max;i++)
printf("%d",pos[i]);
else if(pos[0]==0)
for(i=1;i<=max;i++)
printf("%d",pos[i]);
printf("\n");
}

}
}

//Subtraction

//Both Positive
if(a[0]!='-'&&b[0]!='-')
{
if(m==1)
{
for(i=max;i>=0;i--)
{
if(ix==-1)
{
ix=0;
x[ix]='0';
}
if(iy==-1)
{
iy=0;
y[iy]='0';
}
if((x[ix]-48)-(y[iy]-48)<0)
{
x[ix]+=10;
x[ix-1]-=1;
neg[i]=(x[ix]-48)-(y[iy]-48);
ix--;
iy--;
}
else
{
neg[i]=(x[ix]-48)-(y[iy]-48);
ix--;
iy--;
}
}
printf("a-b=");
if(neg[0]!=0)
for(i=0;i<=max;i++)
printf("%d",neg[i]);
else if(neg[0]==0)
for(i=1;i<=max;i++)
printf("%d",neg[i]);
printf("\n");
}
else if(m==2)
{
for(i=max;i>=0;i--)
{
if(ix==-1)
{
ix=0;
x[ix]='0';
}
if(iy==-1)
{
iy=0;
y[iy]='0';
}
if((y[iy]-48)-(x[ix]-48)<0)
{
y[iy]+=10;
y[iy-1]-=1;
neg[i]=(y[iy]-48)-(x[ix]-48);
ix--;
iy--;
}
else
{
neg[i]=(y[iy]-48)-(x[ix]-48);
ix--;
iy--;
}
}
printf("a-b=-");
if(neg[0]!=0)
for(i=0;i<=max;i++)
printf("%d",neg[i]);
else if(neg[0]==0)
for(i=1;i<=max;i++)
printf("%d",neg[i]);
printf("\n");

}
}

//Both Negative
if(a[0]=='-'&&b[0]=='-')
{
if(m==1)
{
for(i=max;i>=0;i--)
{
if(ix==-1)
{
ix=0;
x[ix]='0';
}
if(iy==-1)
{
iy=0;
y[iy]='0';
}
if((x[ix]-48)-(y[iy]-48)<0)
{
x[ix]+=10;
x[ix-1]-=1;
neg[i]=(x[ix]-48)-(y[iy]-48);
ix--;
iy--;
}
else
{
neg[i]=(x[ix]-48)-(y[iy]-48);
ix--;
iy--;
}
}
printf("a-b=-");
if(neg[0]!=0)
for(i=0;i<=max;i++)
printf("%d",neg[i]);
else if(neg[0]==0)
for(i=1;i<=max;i++)
printf("%d",neg[i]);
}
else if(m==2)
{
for(i=max;i>=0;i--)
{
if(ix==-1)
{
ix=0;
x[ix]='0';
}
if(iy==-1)
{
iy=0;
y[iy]='0';
}
if((y[iy]-48)-(x[ix]-48)<0)
{
y[iy]+=10;
y[iy-1]-=1;
neg[i]=(y[iy]-48)-(x[ix]-48);
ix--;
iy--;
}
else
{
neg[i]=(y[iy]-48)-(x[ix]-48);
ix--;
iy--;
}
}
printf("a-b=");
if(neg[0]!=0)
for(i=0;i<=max;i++)
printf("%d",neg[i]);
else if(neg[0]==0)
for(i=1;i<=max;i++)
printf("%d",neg[i]);

}
}

//one Negative other Positive
if(a[0]=='-'&&b[0]!='-'||a[0]!='-'&&b[0]=='-')
{
for(i=max;i>=0;i--)
{
if(ix==-1)
{
ix=0;
x[ix]='0';
}
if(iy==-1)
{
iy=0;
y[iy]='0';
}
neg[i]=((x[ix]-48)+(y[iy]-48)+d)%10;
d=((x[ix]-48)+(y[iy]-48)+d)/10;
ix--;
iy--;
}
if(a[0]!='-')
{
printf("a-b=");
if(neg[0]!=0)
for(i=0;i<=max;i++)
{
printf("%d",neg[i]);
}
else if(neg[0]==0)
for(i=1;i<=max;i++)
{
printf("%d",neg[i]);
}
}
else
{
printf("a-b=-");
if(neg[0]!=0)
for(i=0;i<=max;i++)
{
printf("%d",neg[i]);
}
else if(neg[0]==0)
for(i=1;i<=max;i++)
{
printf("%d",neg[i]);
}
}

}
return 0;
}
``````
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.