大数相加(类似杭电oj平台上acm1002)
/*输入两个非常大的整数(完全超出了int、long的表示范围),这个整数的长度可能超过100位,计算并输出这两个数相加的结果。*/
//自己用题目所给的案例测试,输出是正确的,也能输出正确的结果,不知道为什么提交以后一直wa,(如果有人测试了我代码以后知道我wa的原因请评论中提出哦,十分感谢),但是算法思想应该是对的,也参考了其他人的博客,(http://blog.csdn.net/hackbuteer1/article/details/6667026的大数相加的题目)
我的代码如下:
//大数相加
#include<stdio.h>
#include<string.h>
#define N 1010
char a[N], b[N], c[N];
int sum[N];
int main()
{
int len1, len2, m, k, temp, len;
int i, j;
int test;
while (scanf("%d", &test) != EOF)
{
for (int index = 0; index < test; index++)
{
scanf("%s%s", a, b);
len1 = strlen(a);len2 = strlen(b);
if (len1 < len2)//确保字符串a不短于字符串b
{
strcpy(c, a);strcpy(a, b);strcpy(b, c);
m = len1;len1 = len2;len2 = m;
}
k = m = 0;temp = 0;len = 0;
for (i = len1 - 1, j = len2 - 1; i >= 0; i--, j--)//从低位开始相加,模拟手工运算,逐位相加
{
if (j < 0)
{
temp = a[i] - '0' + m;
}
else
{
temp = a[i] - '0' + b[j] - '0' + m;
}
sum[k++] = temp % 10;
m = temp / 10;//进位
}
len = k;//len用来记录sum的长度
if (m > 0)//如果加完还有进位m,则加在sum的高位
{
len++;
sum[len - 1] = m;
}
int cnt=index+1;
printf("Case %d:\n", cnt);
printf("%s + %s = ", a, b);
//从低位开始输出
for (i = len - 1; i >= 0; i--)
{
printf("%d", sum[i]);
}
if (index<test)
printf("\n\n");
else
printf("\n");
/*if (m>0)
{
//printf("%d", m);
sum[k] = m;
printf("Case %d:\n", ++index);
printf("%s + %s = ", a, b);
for (i = k ; i >= 0; i--)
{
printf("%d", sum[i]);
}
}
else
{
printf("Case %d:\n", ++index);
printf("%s + %s = ", a, b);
for (i = k-1; i >= 0; i--)
{
printf("%d", sum[i]);
}
}
printf("\n");
*/
}
}
return 0;
}