题目描述:
输入一组以0结尾的超级大数,输出这些超级大数相加的结果。
思路:
题目较为简单,但是如果直接利用数值类型存储组内数据是行不通的,因此利用字符串存储输入数据,计算结果以字符串输出。
#include <cstdio>
#include <cstring>
/*
* 库函数strrev在本地编译可以通过,但是在OJ编译错误
* 所以还得自己重新编写字符串翻转函数
*/
void strlrev(char *s)
{
char c;
int len = strlen(s);
for(int i = 0; i < len / 2; i++)
{
c = s[i];
s[i] = s[len - i - 1];
s[len - i - 1] = c;
}
}
/*
* 字符串实现两大数相加
* 结果存储在字符串a中,字符串a初始全为0
* 计算结束,将字符串a翻转即为两数的和
*/
void add(char *a, char *b)
{
strlrev(b);
int la = strlen(a);
int lb = strlen(b);
int i = 0, j = 0, k = 0, s = 0, inc = 0;
while(i < la && j < la)
{
s = (a[i] & 0XF) + (b[j] & 0XF) + inc;
a[k++] = (s % 10) + '0';
inc = s / 10;
i++; j++;
}
while(i < la)
{
s = (a[i] & 0XF) + inc;
a[k++] = (s % 10) + '0';
inc = s / 10;
i++;
}
while(j < lb)
{
s = (b[j] & 0XF) + inc;
a[k++] = (s % 10) + '0';
inc = s / 10;
j++;
}
if(inc != 0)
a[k++] = inc + '0';
}
int main()
{
char a[150], b[150];
memset(a, 0, sizeof(a)); //初始化字符串a为全零
while(scanf("%s", b) && strcmp(b, "0") != 0)
{
add(a, b);
memset(b, 0, sizeof(b)); //每次计算后要将字符串reset
}
strlrev(a);
printf("%s\n", a);
return 0;
}