2013-12-07 回答
以前我也做过一个大整数程序,2000!,不过那里面没有减法。做这个减法真让花时间啊。
#include
#include
#include
#define max 4000/*数位上限*/
dd(char *a)
{
char t[max];
int i,j;
for(i=0;i {
if(a[i]==null)
{
for(j=0;i>0;j++,i--)
{
t[j]=a[i-1];
}
strncpy(a,t,j);
break;
}
}
}
add1(char *a,char *b,int n,char *c)
{
int n;
if(*a!=null&&*b!=null)
n=*a-'0'+*b-'0'+n;
else if(*a==null&&*b!=null)
n=*b-'0'+n;
else if(*a!=null&&*b==null)
n=*a-'0'+n;
else
n=n;
*c=(n%10)+'0';
n=n/10;
if(*(a+1)!=null||*(b+1)!=null||n!=0)
{
add1(a+1,b+1,n,c+1);
}
}
addab(char *a,char *b,char *c)
{
dd(a);
dd(b);
dd(c);
add1(a,b,0,c);
dd(a);
dd(b);
dd(c);
}
d_(char *a)
{
int i;
for(i=0;a[i]!=null;i++)
{
a[i]=a[i+1];
}
}
udg1(char *a,char *b,int n,char *c)
{
int n;
if(*b==null)
{
n=*a-'0'-n;
n=0;
}
else
{
if(*a>=(*b+n))
{
n=*a-*b-n;
n=0;
}
else
{
n=*a+10-*b-n;
n=1;
}
}
*c=n+'0';
if(*(a+1)!=null)
udg1(a+1,b+1,n,c+1);
}
udg(char *a,char *b,char *c)
{
int i;
if((strcmp(a,b)>0&&strlen(a)==strlen(b))||strlen(a)>strlen(b))
i=1;
else if((strcmp(a,b)<0&&strlen(a)==strlen(b))||strlen(b)>strlen(a))
i=-1;
else
i=0;
dd(a);
dd(b);
dd(c);
if(i==1)
udg1(a,b,0,c);
else if(i==-1)
{
udg1(b,a,0,c);
for(i=0;i {
if(c[i]==null)
{
c[i]='-';
break;
}
}
}
else
*c='0';
dd(a);
dd(b);
dd(c);
}
add_(char *c)
{
int i;
char t1,t2;
t1=c[0];
t2=c[1];
c[0]='-';
for(i=1;t1!='\0';i++)
{
c[i]=t1;
t1=t2;
t2=c[i+1];
}
}
main()
{
char a[max]={null},b[max]={null},c[max]={null};
printf("输入两个数:\n");
scanf("%s",a);
getchar();
scanf("%s",b);
getchar();
if(a[0]!='-'&&b[0]!='-')
{
addab(a,b,c);
}
else
{
if(a[0]=='-'&&b[0]!='-')
{
d_(a);
udg(b,a,c);
}
else if(a[0]!='-'&&b[0]=='-')
{
d_(b);
udg(a,b,c);
}
else
{
d_(b);
d_(a);
addab(a,b,c);
add_(c);
}
}
printf("%s\n",c);
getchar();
}