给定两个正整数,计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1≤整数长度≤100000
输入样例:
12
23
输出样例:
35
做法:大数化小数,分为若干个长度为8的小数
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e8;
string n, m;
vector<int> a, b, c;
void add(vector<int> &a, vector<int> &b){//加上引用可以提高效率,不加引用会copy
if (a.size() < b.size()) return add(b, a);
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 % N);
t /= N;
}
if (t) c.push_back(t);
}
int main(){
cin >> n >> m;
//每次都将一个9为数放入vector中,将大数变为每个长为9的小数
for (int i = n.size() - 1, s = 0, t = 1, j = 0; i >= 0; i -- ){
s += (n[i] - '0') * t;
j ++; t *= 10;
if (j == 8 || i == 0){
a.push_back(s);
s = 0;
t = 1;
j = 0;
}
}
for (int i = m.size() - 1, s = 0, t = 1, j = 0; i >= 0; i -- ){
s += (m[i] - '0') * t;
j ++; t *= 10;
if (j == 8 || i == 0){
b.push_back(s);
s = 0;
t = 1;
j = 0;
}
}
add(a, b);
//得到的是倒序,输出是需要正序
printf("%d", c.back());
for (int i = c.size() - 2; i >= 0; i -- ) printf("%08d", c[i]);
return 0;
}