int minus(void)
{
char s1[M],s2[M];
int a[M]={0},b[M]={0},l1,l2,c,k,i;
printf(“2.长整数的减法:\n”);
printf(“请输入两个长整数(输完一个按一次回车):\n”);
gets(s1);
gets(s2);
l1=strlen(s1);
l2=strlen(s2);
if(l1<l2)
k=l2;
else k=l1;
c=k;
for(i=0;i<l1;k–,i++)
a[k]=s1[l1-1-i]-“0”;
for(k=c,i=0;i<l2;k–,i++)
b[k]=s2[l2-1-i]-“0”;
printf(“\n”);
for(i=c;i>=0;i–)
{
a[i]-=b[i];
if(a[i]>=10)
{
a[i]+=10;
a[i-1]–;
}
}
printf(“结果是:\n”);
if(a[0]!=0)
{
for(i=0;i<=c;i++)
printf(“%d”,a[i]);
}
else
{
for(i=1;i<=c;i++)
printf(“%d”,a[i]);
}
printf(“\n”);
return 0;
{
char s1[M],s2[M];
int a[M]={0},b[M]={0},l1,l2,c,k,i;
printf(“2.长整数的减法:\n”);
printf(“请输入两个长整数(输完一个按一次回车):\n”);
gets(s1);
gets(s2);
l1=strlen(s1);
l2=strlen(s2);
if(l1<l2)
k=l2;
else k=l1;
c=k;
for(i=0;i<l1;k–,i++)
a[k]=s1[l1-1-i]-“0”;
for(k=c,i=0;i<l2;k–,i++)
b[k]=s2[l2-1-i]-“0”;
printf(“\n”);
for(i=c;i>=0;i–)
{
a[i]-=b[i];
if(a[i]>=10)
{
a[i]+=10;
a[i-1]–;
}
}
printf(“结果是:\n”);
if(a[0]!=0)
{
for(i=0;i<=c;i++)
printf(“%d”,a[i]);
}
else
{
for(i=1;i<=c;i++)
printf(“%d”,a[i]);
}
printf(“\n”);
return 0;
解决方案
10
首先,前导0 不要输出,这可以用位数表示
其次 假如只有一个数,并且是0 输出0
其次 假如只有一个数,并且是0 输出0
30
仅供参考:
#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) { scanf("%d",&n); for (j=0;j<n;j++) { scanf("%s%s",a1,a2); L=strlen(a1); for (i=0;i<L;i++) v1[i]=a1[L-1-i]-"0"; L=strlen(a2); for (i=0;i<L;i++) v2[i]=a2[L-1-i]-"0"; for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i]; for (i=0;i<MAXLEN;i++) { if (v3[i]>=10) { v3[i+1]+=v3[i]/10; v3[i]=v3[i]%10; } } printf("Case %d:\n", j+1); printf("%s + %s = ", a1, a2); z=0; for (i=MAXLEN-1;i>=0;i--) { if (z==0) { if (v3[i]!=0) { printf("%d",v3[i]); z=1; } } else { printf("%d",v3[i]); } } if (z==0) printf("0"); printf("\n"); } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110