20200216-题目

NC14581 客官这边请(A+B)

题目

我有一个很简单的题目,给你两个整数A和B,请把A和B的结果算出来。

输入描述

第一个行会输入一个整数T(1<=T<=20),代表有T组测试数据,接下来T行,每一行会输入两个整数A和B(0<A,B<10的100次方)。

输出描述

每一个测试数据,你要输出两行,第一行是Case #:#代表第T组测试数据,第二行要输出A + B = SumSumA+B的结果。
两组数据之间输出一个换行。

题解

注意到A和B的最大值有可能达到10的100次方,这远远超过了C/C++的长长整形能够表示的数据范围,而long double会损失精度,所以需要手动处理这些数据的加法(Python无视,因为其数据可以是任意大的),需要用字符串来接收输入的数据。

考虑到直接对字符串的处理比较困难(实际操作其实也还可以),可以自定义一个数据类型,用数组储存每位数字,并实现加法。

代码

Python

1
2
3
4
5
6
7
T = int(input())
for i in range(1, T + 1):
a, b = map(int, input().split())
print('Case %d:' % i)
print(a, '+', b, '=', a + b)
if i != T:
print()

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
const short N = 105;

//储存大型数据的LongInt类
class LongInt {
private:
short self[N]; //保存每一位的数字,共N=105位
public:
//构造函数,用字符串init初始化数组self
LongInt(const string& init) {
short index;
for (index = 0; index < N - init.length(); ++index)
self[index] = 0;
for (short i = 0; index < N; ++index, ++i)
self[index] = init[i] - '0';
}
//将数组self中的数据组成字符串
string get() const {
ostringstream os;
//辅助判断是否输出了第一个非零数字
bool done = false;
for (short i : self) {
//前零不输出判断
if (i != 0 || (i == 0 && done)) {
os << i;
if (i != 0) done = true;
}
}
return os.str();
}
//将一个LongInt对象加到这个对象上
void add(const LongInt& num) {
for (short i = N-1; i >= 0; --i) {
self[i] += num.self[i];
if (self[i] > 9) {
self[i - 1]++;
self[i] %= 10;
}
}
}
};


int main() {
int T;
cin >> T;
for (int i = 1; i <= T; i++) {
string as, bs;
cin >> as >> bs;
cout << "Case " << i << ':' << endl;
cout << as << " + " << bs << " = ";
//用两个字符串as、bs初始化a、b
LongInt a(as), b(bs);
a.add(b);
cout << a.get() << endl;
if (i != T)
cout << endl;
}
return 0;
}