描述 | |
计算a+b的值 | |
关于输入 | |
第一行输入测试数据的数目 n 接下来 n 行,每行输入两个非负整数a和b,它们的位数<=200 | |
关于输出 | |
输出数据有 n 行,每行输出一个非负整数,即对应数据 a+b 的值,不允许有前导的“0” | |
例子输入 | |
1 11111111111111111111111111111111111 22222222222222222222222222222222222 | |
例子输出 | |
33333333333333333333333333333333333 | |
提示 | |
请用字符串输入数据,并模拟人工竖式计算 |
#include<iostream>
#include<cmath>
using namespace std;
string a, b;//用来存放两个数
char c[210];//存放结果
int la = 0, lb = 0;//两个数的长度
int flag = 0;//进位的数
void f()
{
if (la == lb) {
for (int i = la - 1; i >= 0; --i) {//从最后一位开始算
int temp = a[i] + b[i] - 2*'0';
if (flag != 0) {
c[i+1] = temp % 10 + flag + '0';
}
else c[i+1] = temp % 10 + '0';
if (temp > 9) {//进位
flag = temp / 10;
}
else flag = 0;//如果不够10,进位应重置为0
}
c[0] = flag+'0';
}
else if (la > lb) {
int temp;
for (int i = la - 1; i >= la - lb; --i) {
temp = a[i] + b[i - la + lb] - 2 * '0' + flag;
c[i + 1] = temp % 10 + '0';
if (temp > 9) {
flag = temp / 10;
}
else flag = 0;
}
for (int i = la - lb - 1; i >= 0; --i) {
temp = a[i] - '0' + flag;
c[i + 1] = temp % 10 + '0';
if (temp > 9) { flag = temp / 10; }
else flag = 0;
}
c[0] = flag + '0';
}
else if (la < lb) {
int temp;
for (int i = lb - 1; i >= lb - la; --i) {
temp = b[i] + a[i - lb + la] - 2 * '0' + flag;
c[i + 1] = temp % 10 + '0';
if (temp > 9) {
flag = temp / 10;
}
else flag = 0;
}
for (int i = lb - la - 1; i >= 0; --i) {
temp = b[i] - '0' + flag;
c[i + 1] = temp % 10 + '0';
if (temp > 9) { flag = temp / 10; }
else flag = 0;
}
c[0] = flag + '0';
}
}
int main()
{
int n;
cin >> n;
while (n--) {
cin >> a >> b;
la = a.size();
lb = b.size();
f();
int i;
bool x = 0;
for (i = 0; i <= max(la,lb); ++i) {
if (c[i] == '0' && x == 0) {
continue;
}
else if (c[i] != 0) {
x = 1;
}
cout << c[i];
}
cout << endl;
if (x == 0)cout << 0 << endl;
flag = 0;
}
return 0;
}