题目描述
求a+b的值
输入
第一行一个整数T,表示接下来有T行
每行两个整数是a,b,(0<=a,b<=10^10000)
输出
输出值
输入样例
2
100 100
10000000000 10000000000
输出样例
200
20000000000
思路
从这个题目数的范围可以得出a,b是大数,只能用字符数组或字符串存储;
#include<bits/stdc++.h>
using namespace std;
const int N = 1.0e+5;
struct bign
{
int d[N];
int len;
bign()
{
memset(d,0,sizeof(d));
len = 0;
}
};
bign change(char str[]) //将字符数组存储的字符翻转位置存储在结构体定义的整型数组
{
bign a;
a.len = strlen(str);
for(int i = 0;i < a.len; ++i)
{
a.d[i] = str[a.len-i-1]-'0';
}
return a;
}
bign add(bign a,bign b)
{
bign c;
int carry=0; //代表进位
for(int i = 0;i<a.len||i<b.len; ++i)
{
int temp = carry+(a.d[i]+b.d[i]); //模拟加法的过程,两个数相加,加上前面得到的进位
c.d[c.len++] = temp%10;
carry = temp/10; //得到进位数
}
if(carry) //如果进位大于0
{
c.d[c.len++] = carry; //放在数组的末尾
}
return c;
}
void print(bign a)//输出两个数相加的结果
{
for(int i = a.len-1;i >= 0; --i)
cout<<a.d[i];
}
int main()
{
char s1[100000]; //用两个字符数组存储大数
char s2[100000];
int n;
cin>>n;
while(n--){
cin>>s1>>s2;
bign a = change(s1);
bign b = change(s2);
print(add(a,b));
cout<<endl;
}
return 0;
}