注意这题有几个小点:
1. 相加的数的范围非常大,所有即便用unsigned long long int也是九牛一毛,所以这种做法是肯定不行的
2. 用两个数组分别记录两串数字,然后一位一位两两相加
3. 先把两个数组翻转,然后从下标0开始两两相加,相加超过10就进位1。
这是我认为比较直接的方法,实际上只需要两个数组就可以了,将a[i]+b[i]任意给a[i],b[i]都可以,因为a[i]+b[i]后,前面的数就不需要了,只考虑新的数和进位
#include<stdio.h>
#include<string>
#include<math.h>
#include<algorithm>
char a[10001];
char b[10000];
char c[10000];
int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
int main()
{
scanf_s("%s", a, 10000);
scanf_s("%s", b, 10000);
int a_len = strlen(a);
int b_len = strlen(b);
int c_len = max(a_len, b_len);
for (int i = 0; i < a_len/2; i++)//将数组的元素翻转一下
{
char temp;
temp = a[i];
a[i] = a[a_len -1- i];
a[a_len - 1 - i] = temp;
}
for (int i = 0; i < b_len/2; i++) //同理
{
char temp;
temp =b[i];
b[i] = b[b_len - 1 - i];
b[b_len - 1 - i] = temp;
}
for (int i = 0; i < a_len; i++)
a[i] -= 48; //将ascll码转换成数字0-9
for (int i = 0; i < b_len; i++)
b[i] -= 48; //将ascll码转换成数字0-9
int jinwei=0; //进位数
for (int i = 0; i < c_len + 1; i++) //将a[i]+b[i]的值一一给c[i]
{
if (a[i] + b[i] + jinwei <= 9) //不进位
{
c[i] = a[i] + b[i]+jinwei;
jinwei = 0;
}
else
if (a[i] + b[i]+jinwei>= 10) //相加大于10进位
{
c[i] = (a[i] + b[i] +jinwei)- 10;
jinwei =1;
}
}
if (c[c_len] != 0) //最后一个数是否为0,如果是0,就不输出。
printf("%d", c[c_len]);
for (int i = c_len-1; i >=0; i--)
printf("%d", c[i]);
return 0;
}
稍微优化一下:
#include<stdio.h>
#include<cstring>
#include<math.h>
#include<algorithm>
char a[10000];
char b[10000];
int main()
{
scanf("%s", a);
scanf("%s", b);
int a_len = strlen(a);
int b_len = strlen(b);
int max,min;
if(a_len>=b_len)
max=a_len;
else
max=b_len;
for (int i = 0; i < a_len/2; i++)//将数组的元素翻转一下
{
char temp;
temp = a[i];
a[i] = a[a_len -1- i];
a[a_len - 1 - i] = temp;
}
for (int i = 0; i < b_len/2; i++)
{
char temp;
temp =b[i];
b[i] = b[b_len - 1 - i];
b[b_len - 1 - i] = temp;
}
for (int i = 0; i < a_len; i++)
a[i] -= 48; //将ascll码转换成数字0-9
for (int i = 0; i < b_len; i++)
b[i] -= 48; //将ascll码转换成数字0-9
int jinwei=0; //进位数
for (int i = 0; i < max + 1; i++) //将a[i]+b[i]的值一一给a[i]
{
if (a[i] + b[i] + jinwei <= 9) //不进位
{
a[i] = a[i] + b[i]+jinwei;
jinwei = 0;
}
else
if (a[i] + b[i]+jinwei>= 10)
{
a[i] = (a[i] + b[i] +jinwei)- 10;
jinwei =1;
}
}
if (a[max] != 0) //最后一个数是否为0,如果是0,就不输出。
printf("%d", a[max]);
for (int i = max-1; i >=0; i--)
printf("%d", a[i]);
return 0;
}