杭电oj这道题的解法是要通过字符数组储存数字在进行运算的,同时涉及到数值进位的问题,以下是代提供码参考。
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char a[1000],b[1000];
- int sum[10000]={0};
- int c,d,e,f,g,i,n,s;
- scanf("%d",&n);
- f=48;
- s=1;
- c=n;
- while(n--)
- {
- scanf("%s",a+1);
- scanf("%s",b+1);
- printf("Case %d:\n",s);
- printf("%s + %s = ",a+1,b+1);
- d=strlen(a+1);
- e=strlen(b+1);
- for(i=1;i<=d;i++)
- a[i]=a[i]-48;
- for(i=1;i<=e;i++)
- b[i]=b[i]-48;
- if(d==e) //数字位数相同的情况
- {
- for(i=1;i<=d;i++)
- {
-
- if(a[i]+b[i]>=10&&i>=2)
- {
- sum[i-2]=sum[i-2]+1;//向前面的一个sum加一进位,比如10+1
- sum[i-1]=(a[i]+b[i]-10);//进一位后再减去10,比如15-1=5
- }
- else
- sum[i-1]=a[i]+b[i];
- }
- }
- else if(d>e) //数字位数不相同的情况
- {
- for(i=1;i<=d-e;i++)
- sum[i]=a[i];
- f=1;
- for(i=d-e+1;i<=d;i++)
- {
- if(a[i]+b[f]>=10)
- {
- sum[i-1]=sum[i-1]+1;
- sum[i]=a[i]+b[f]-10;
- if(sum[i-1]>=10)
- {
- for(g=i-1;g>=1;g--)//考虑前面位数为10的进位
- {
- if(sum[g]>=10)
- {
- sum[g-1]=sum[g-1]+1;
- sum[g]=sum[g]-10;
- }
- }
- }
- }
- else
- sum[i]=a[i]+b[f];
- f++;
- }
- }
- else if(d<e) //数字位数不相同的情况
- {
- for(i=1;i<=e-d;i++)
- sum[i]=b[i];
- f=1;
- for(i=e-d+1;i<=e;i++)
- {
- if(a[f]+b[i]>=10)
- {
- sum[i-1]=sum[i-1]+1;
- sum[i]=a[f]+b[i]-10;
- if(sum[i-1]>=10)
- {
- for(g=i-1;g>=1;g--)
- {
- if(sum[g]>=10)
- {
- sum[g-1]=sum[g-1]+1;
- sum[g]=sum[g]-10;
- }
- }
- }
- }
- else
- sum[i]=a[f]+b[i];
- f++;
- }
- }
- if(d==e)
- {
- for(i=0;i<d;i++)
- printf("%d",sum[i]);
- sum[0]=0;
- s++;
- }
- if(d>e)
- {
- if(sum[0]==0)
- {
- for(i=1;i<=d;i++)
- printf("%d",sum[i]);
- }
- else
- {
- for(i=0;i<=d;i++)
- printf("%d",sum[i]);
- sum[0]=0;
- }
- s++;
- }
- if(d<e)
- {
- if(sum[0]==0)
- {
- for(i=1;i<=e;i++)
- printf("%d",sum[i]);
- }
- else
- {
- for(i=0;i<=e;i++)
- printf("%d",sum[i]);
- sum[0]=0;
- }
- s++;
- }
- if(s!=c+1)
- {
- printf("\n");
- printf("\n");
- }
- else
- printf("\n");
- }
- }
注意输出的格式。
其实说复杂也不复杂,有些地方是类似的。