Hello I am HERE!
题目描述
There are many difficulties in today's contest, but this is definitely not one of them.
Because I want you to do it, the classic A+B.
输入描述:
First line an Integer N means n test cases.
Next 2N lines representing 2N groups of different Integers.
N<50.
THE LENGTH of every Integer will less than 5000.
All Integers will be greater than 0.
Some cases may have leading zero.
输出描述:
One line for each test cases reprecenting the answer of A+B.
Do not putout leading zero
示例1
输入
1
100000000000000
100000000000000
输出
200000000000000
备注:
You do not have to use FFT.
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
问题分析: 在高精度加法模板题的基础上增加了前导零的处理,其中一种处理前导零的方法是先记录前导零个数,再遍历无前导零部分即可,具体代码如下。
#include <iostream> #include <vector> using namespace std; vector<int> add(vector<int> &A, vector<int> &B) // 高精度加法处理 { if(A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for(int i = 0; i < A.size(); i ++){ t += A[i]; if(i < B.size()) t += B[i]; C.push_back(t % 10); t /= 10; } if(t) C.push_back(t); return C; } int main() { int n; cin >> n; while(n --){ string a, b; vector<int> A, B; cin >> a >> b; int cnt1 = 0, cnt2 = 0; for(int i = 0; i <= a.size() - 1; ){ // 记录a中的前导零个数 while(a[i] == '0') i ++, cnt1 ++; break; } for(int i = 0; i <= b.size() - 1; ){ // 记录b中的前导零个数 while(b[i] == '0') i ++, cnt2 ++; break; } for(int i = a.size() - 1; i >= cnt1; i --) A.push_back(a[i] - '0'); for(int i = b.size() - 1; i >= cnt2; i --) B.push_back(b[i] - '0'); auto C = add(A, B); for(int i = C.size() - 1; i >= 0; i --) cout << C[i]; cout << endl; } return 0; }