下面这段程序包含了大数的加、减、乘运算的代码,除法运算尚在研究中。

 

/*
 * =====================================================================================
 *
 *       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;
}