下面这段程序包含了大数的加、减、乘运算的代码,除法运算尚在研究中。
/*
* =====================================================================================
*
* Filename: LargeNumOp.c
*
* Description: The regular version of Large Number Multiplication.
*
* Version: 1.0
* Created: 08/23/2009 07:02:48 PM
* Revision: none
* Compiler: gcc
*
* Author: Bonn Yang
* Company:
*
* =====================================================================================
*/
#include <stdio.h>
#include <string.h>
/*
* Large number multiplication.
* a*b=c
* The product stores in c.
*/
void multiply(char* a,char* b,char* c)
{
int i,j,ca,cb,* s;
ca=strlen(a);
cb=strlen(b);
s=(int*)malloc(sizeof(int)*(ca+cb));
for (i=0;i<ca+cb;i++)
s[i]=0;
for (i=0;i<ca;i++)
for (j=0;j<cb;j++)
s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
for (i=ca+cb-1;i>=0;i--)
if (s[i]>=10)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
i=0;
while (s[i]==0)
i++;
for (j=0;i<ca+cb;i++,j++)
c[j]=s[i]+'0';
c[j]='/0';
free(s);
}
/* Large number addition
* a+b=c
*/
void add(char* a, char* b, char* c)
{
int i,j,ca,cb,rlen,* s;
ca=strlen(a);
cb=strlen(b);
rlen=((ca>cb)?ca:cb)+1; /* len of result */
s=(int*)malloc(sizeof(int)*rlen);
for (i=0;i<rlen;i++)
s[i]=0;
if(ca>cb)
{
for(i=0;i<ca-cb;i++)
s[i+1]=a[i]-'0';
for(i=ca-cb;i<ca;i++)
s[i+1]=(a[i]-'0')+(b[i-ca+cb]-'0');
}
else
{
for(i=0;i<cb-ca;i++)
s[i+1]=b[i]-'0';
for(i=cb-ca;i<cb;i++)
s[i+1]=(a[i-cb+ca]-'0')+(b[i]-'0');
}
for (i=rlen-1;i>=0;i--)
if (s[i]>=10)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
i=0;
while (s[i]==0)
i++;
for (j=0;i<rlen;i++,j++)
c[j]=s[i]+'0';
c[j]='/0';
free(s);
}
/* Large number substraction
* a-b=c
*/
void sub(char* a,char* b,char* c)
{
int i,j,ca,cb,rlen,* s;
ca=strlen(a);
cb=strlen(b);
rlen=((ca>cb)?ca:cb)+1; /* len of result, the first byte is negative or positive sign */
s=(int*)malloc(sizeof(int)*rlen);
for (i=0;i<rlen;i++)
s[i]=0;
if(ca>cb)
{
s[0]='+';
for(i=ca-1;i>=ca-cb;i--)
{
if(a[i]>b[i-ca+cb])
{
s[i+1]=(a[i]-'0')-(b[i-ca+cb]-'0');
}
else if(a[i]<b[i-ca+cb])
{
s[i+1]=(a[i]-'0'+10)-(b[i-ca+cb]-'0');
a[i-1]-=1;
}
else
s[i+1]=0;
}
for(i=ca-cb-1;i>=1;i--)
{
if(a[i]>0)
{
s[i+1]=(a[i]-'0');
}
else if(a[i]<0)
{
s[i+1]=a[i]-'0'+10;
a[i-1]-=1;
}
else
s[i+1]=0;
}
s[1]=a[i]-'0';
}
else if(ca<cb)
{
s[0]='-';
for(i=cb-1;i>cb-ca-1;i--)
{
if(b[i]>a[i-cb+ca])
{
s[i+1]=(b[i]-'0')-(a[i-cb+ca]-'0');
}
else if(b[i]<a[i-ca+cb])
{
s[i+1]=(b[i]-'0'+10)-(a[i-cb+ca]-'0');
b[i-1]-=1;
}
else
s[i+1]=0;
}
for(i=cb-ca-1;i>=1;i--)
{
if(b[i]>0)
{
s[i+1]=(b[i]-'0');
}
else if(b[i]<0)
{
s[i+1]=b[i]-'0'+10;
b[i-1]-=1;
}
else
s[i+1]=0;
}
s[1]=b[i]-'0';
}
else /* ca==cb */
{
if(strcmp(a,b)>0) /* a>b */
{
s[0]='+';
for(i=ca-1;i>=1;i--)
{
if(a[i]>b[i])
{
s[i+1]=(a[i]-'0')-(b[i]-'0');
}
else if(a[i]<b[i])
{
s[i+1]=(a[i]-'0'+10)-(b[i]-'0');
a[i-1]-=1;
}
else
s[i+1]=0;
}
s[1]=(a[i]-'0')-(b[i]-'0');
}
else if(strcmp(a,b)<0) /* a<b */
{
s[0]='-';
for(i=ca-1;i>=1;--i)
{
if(b[i]>a[i])
{
s[i+1]=(b[i]-'0')-(a[i]-'0');
}
else if(b[i]<a[i])
{
s[i+1]=(b[i]-'0'+10)-(a[i]-'0');
b[i-1]-=1;
}
else
s[i+1]=0;
}
s[1]=(b[i]-'0')-(a[i]-'0');
}
else /* a==b */
{
c[0]='+';
c[1]='0';
c[2]='/0';
free(s);
}
}
c[0]=s[0];
i=1;j=1;
while ((s[i]==0) && (i<rlen))
i++;
if(i!=rlen) /* result is not zero */
{
for (j=1;i<rlen;i++,j++)
{
if(s[i]<0)
c[j]='0'-s[i];
else
c[j]=s[i]+'0';
}
} else { /* result is zero */
c[j++]='0';
}
c[j]='/0';
free(s);
}
int main()
{
char a[1024]={'/0'};
char b[1024]={'/0'};
char c[1024]={'/0'};
printf("Enter two numbers:/n");
gets(a);
gets(b);
multiply(a,b,c);
printf("%s * %s = %s/n",a,b,c);
add(a,b,c);
printf("%s + %s = %s/n",a,b,c);
sub(a,b,c);
printf("%s - %s = %s/n",a,b,c);
return 0;
}