http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2§ionid=3&problemid=1
题意:大整数(不超过1千位)的相加
解法:对于大整数,无论用int还是__int64都没有足够的长度存储,只能采用字符数组或字符串。
首先分别获取两个操作数的长度,从最后一位开始,两两相加,若有进位,则在下一位加上。
之后剩余的位做相同的操作,需要注意的是最后一位(最高位),若有进位,则得数总长度加1。
#include <stdio.h>
#include <string.h>
int main()
{
int cas,lenA,lenB;
int j,k,p,flag;
char a[1001],b[1001],c[1002];
scanf("%d",&cas);
for(int i = 1;i <= cas;i++)
{
scanf("%s %s",a,b);
printf("Case %d:\n%s + %s = ", i,a,b);
lenA = strlen(a);
lenB = strlen(b);
j = lenA - 1;
k = lenB - 1;
p = 0;
flag = 0;
while(j >= 0 && k >= 0) //从最低位开始做加法
{
c[p] = a[j] + b[k] + flag - '0';
if(c[p] > '9') //有进位的话,得数减10,
{
c[p] -= 10;
flag = 1;
}
else flag = 0;
j--;
k--;
p++;
}
while(j >= 0) //余下的位数
{
c[p] = a[j] + flag;
if(c[p] > '9')
{
c[p] -= 10;
flag = 1;
}
else flag = 0;
p++;
j--;
}
while(k >= 0)
{
c[p] = b[k] + flag;
if(c[p] > '9')
{
c[p] -= 10;
flag = 1;
}
else flag = 0;
p++;
k--;
}
if(flag == 1) //最高位是否有进位
c[p++] = '0' + flag;
for(int l = p - 1;l >= 0;l--)
{
printf("%c", c[l]);
}
printf("\n");
if(i != cas)
printf("\n");
}
return 0;
}