20200216-客官这边请(A+B)
客官这边请
https://ac.nowcoder.com/acm/problem/14581
NC14581 客官这边请(A+B)
题目
我有一个很简单的题目,给你两个整数A和B,请把A和B的结果算出来。
输入描述
第一个行会输入一个整数T(1<=T<=20),代表有T组测试数据,接下来T行,每一行会输入两个整数A和B(0<A,B<10的100次方)。
输出描述
每一个测试数据,你要输出两行,第一行是Case #:
,#
代表第T组测试数据,第二行要输出A + B = Sum
,Sum
是A+B
的结果。
两组数据之间输出一个换行。
题解
注意到A和B的最大值有可能达到10的100次方,这远远超过了C/C++的长长整形能够表示的数据范围,而long double会损失精度,所以需要手动处理这些数据的加法(Python无视,因为其数据可以是任意大的),需要用字符串来接收输入的数据。
考虑到直接对字符串的处理比较困难(实际操作其实也还可以),可以自定义一个数据类型,用数组储存每位数字,并实现加法。
代码
Python
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++
#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; }