题目名称:非负整数求和
时间限制:1000ms 内存限制:256M
题目描述:
给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和。 注意: - num1 和 num2 的长度都小于 5100. -
num1 和 num2 都只包含数字 0-9. - num1 和 num2 都不包含任何前导零。 - 你不能使用任何內建
BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
输入描述:
输入整数num1,num2。(0<=num1,num2<=1e100)
输出描述:
输出整数num1,num2的加和。
示例:
输入:
234 222
输出:
456
思路:由于这个数可能超级大,我们就不能用简单的相加来解决了,因此我考虑每个位都占一列,存储在一个超大的数组里,然后取出来逐步相加,得到最终结果。
所需关键变量:
num1[5105]用来存储第一个加数
num1[5105]用来存储第二个加数
sum[5105]用来存储最终结果
只要我们发现该位两数相加大于或等于10,我们就向前进一,然后把对十求余所得到的数赋值给该位。
该算法本人认为比较优,如果有更好的想法,欢迎q我!
代码如下(编译器是dev,语言是C语言):
#include <stdio.h>
#include<stdbool.h>
int control = 0,num1jishu = 1,num2jishu = 1,i,j;
char temp;
int num1[5105] = {0},num2[5105] = {0},sum[5105] = {0};
int main(){
while(true){
scanf("%c",&temp);
if(temp == '\n'){
break;
}
if(temp == ' '){
control = 1;
continue;
}
if(control == 0){
num1[num1jishu++] = temp - 48;
}else{
num2[num2jishu++] = temp - 48;
}
}
i = --num1jishu;
j = --num2jishu;
if(i>=j){
for(;i>0;i--){
if(j == 0){
sum[i] = sum[i] + num1[i];
}else{
sum[i] = sum[i] + num1[i] +num2[j--];
if(sum[i]>=10){
sum[i-1] += 1;
sum[i] = sum[i]%10;
}
}
}
for(i = 0;i<=num1jishu;i++){
if((i == 0)&&(sum[i] == 0)){
continue;
}
printf("%d",sum[i]);
}
}else{
for(;j>0;j--){
if(i == 0){
sum[j] = sum[j] + num2[j];
}else{
sum[j] = sum[j] + num1[i--] +num2[j];
if(sum[j]>=10){
sum[j-1] += 1;
sum[j] = sum[j]%10;
}
}
}
for(i = 0;i<=num2jishu;i++){
if((i == 0)&&(sum[i] == 0)){
continue;
}
printf("%d",sum[i]);
}
}
return 0;
}
结果如下: