题目要求:
简而言之就是输入任意两数进行求和,因为数字很大,所以直接求和显然不行,所以想到了用字符串来做(模拟加法运算)(也可以用数组做)
//格式就不细说了
#include <stdio.h>
#include <string.h>
int change(char a[1010],char b[1010])
{
char c[1010];
int i,j;
int max=(strlen(a)>=strlen(b))?strlen(a):strlen(b);
if(strlen(a)>=strlen(b))
{
for(i=strlen(a)-1,j=strlen(b)-1;i>=0;i--,j--)
{
if(j>=0)
c[i]=b[j];
else
c[i]='0';// 这一步很关键,将长度较小的字符串赋值给另一个字符串,较短的字符串空位置放字符'0'这样就能使两个相加的字符串对齐了;
}
for(i=max-1;i>=0;i--)
{
if((a[i]+c[i]-48)<='9')
{
a[i]=a[i]+c[i]-48; // -48 相当于 -'0' 因为字符0的asc码值为48;
}
else
{
a[i]=a[i]+c[i]-48-10; 如果a[i]+c[i]-48的值大于'9'那么再减掉10 就相当于进位后该位的值;
if(i-1>=0)
a[i-1]+=1;
if(i-1==-1)
printf("1");//当字符串运算到第一位是也就是a[0]+c[0]可能会出现进位,但字符串已经没有空位置,考虑到两个数加法最多进1,所 //这种情况就先输出'1';
}
}
printf("%s\n",a);
}
if(strlen(b)>strlen(a))
{
for(i=strlen(b)-1,j=strlen(a)-1;i>=0;i--,j--)//同上
{
if(j>=0)
c[i]=a[j];
else
c[i]='0';
}
for(i=max-1;i>=0;i--)
{
if(b[i]+c[i]-48<='9')
b[i]=b[i]+c[i]-48;
else
{
b[i]=b[i]+c[i]-48-10;
if(i-1>=0)
b[i-1]+=1;
if(i-1==-1)
printf("1");
}
}
printf("%s\n",b);
}
}
int main()
{
int i=0,n;
scanf("%d",&n);
while(n--)
{
char a[1010];
char b[1010];
if(i>=1)
printf("\n");//控制格式, 每两个Case之间有空行,最后一行没有
scanf("%s",a);
scanf("%s",b);
printf("Case %d:\n",++i);
printf("%s + %s = ",a,b);
change(a,b);
}
return 0;
}
测试数据
99900 00999
00999 99900
000 0000
0 0
1000 0001
9999 1
1 9999
这几个数据和样例都过了,应该可以AC了
以上测试数据由ultimater的博客提供,下面是他的博客hdu1002博客链接
http://blog.csdn.net/ultimater/article/details/7884836