描述
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
提示:
- 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
- 定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
- 计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
- 最后将C输出即可。
输入
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出
输出一行,表示a + b的值。
输入样例 1
20100122201001221234567890 2010012220100122
输出样例 1
20100122203011233454668012
C++代码:
cpp
#include <string.h>
#include <stdio.h>
void reverse(char *str){
int i = 0, j = strlen(str) - 1;
for (; i < j; ++i, --j){
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
void stradd(char *a, char *b, char *c){
reverse(a); // 反转字符串 以便从个位开始计算
reverse(b);
int flag = 0;
int a_longer_than_b = 0;
if (strlen(a) > strlen(b)){
a_longer_than_b = 1;
}
else{
a_longer_than_b = 0;
}
int max_a_b = strlen(a) > strlen(b) ? strlen(a) : strlen(b);
int min_a_b = strlen(a) > strlen(b) ? strlen(b) : strlen(a);
int i = 0;
for (; i < min_a_b; ++i) { // 先计算a和b都有的位
int temp = a[i] - '0' + b[i] - '0' + flag;
if (temp >= 10){
c[i] = temp % 10 + '0';
flag = 1;
}
else{
c[i] = temp + '0';
flag = 0;
}
}
for (; i < max_a_b; ++i){ // 较小的数已经算完了,将另一个数的剩余部分加到结果中
if (a_longer_than_b){
int temp = a[i] - '0' + flag;
if (temp >= 10){
c[i] = temp % 10 + '0';
flag = 1;
}
else{
c[i] = temp + '0';
flag = 0;
}
}
else{
int temp = b[i] - '0' + flag;
if (temp >= 10){
c[i] = temp % 10 + '0';
flag = 1;
}
else{
c[i] = temp + '0';
flag = 0;
}
}
}
if (flag == 1) { // 考虑最后进位的情况
c[max_a_b] = '1';
c[max_a_b + 1] = '\0';
}
reverse(c);
}
int main()
{
char a[102] = {0};
char b[102] = {0};
char c[102] = {0};
fgets(a, 102, stdin);
if (a[strlen(a) - 1] == '\n'){
a[strlen(a) - 1] = '\0';
}
fgets(b, 102, stdin);
if (b[strlen(b) - 1] == '\n'){
b[strlen(b) - 1] = '\0';
}
stradd(a, b, c);
printf("%s\n", c);
return 0;
}