题目
给定两个正整数,计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1 ≤ 1≤ 1≤ 整数长度 ≤ 100000 ≤100000 ≤100000
输入输出样例
样例输入1
12
23
样例输出1
35
思路
高精度。模板题。
将高精度整数的每一位存到数组内,方便进行按位计算。我们设置三个数组A[], B[], C[]
,用于存放高精度数,其中,我们用C[]
存储结果的高精度数。
依据算术加法的逻辑,按位相加取模10。若同一位上的两数相加进位,就需要在高位上加1。我们设置变量t
,用来存储每次按位运算时的进位情况。利用for
循环进行按位加法运算,若该位上有数就加入t
中,将模10后的数存入C[]
后,t/=10
的结果就是下一位的进位数。
int n = A.size(), m = B.size(), t = 0;
for(int i = 0; i < n || i < m; i++) {
if(i < n) t += A[i];
if(i < m) t += B[i];
C.push_back(t % 10); //存
t /= 10;
}
如下图示:
又因为在数组末尾补数是最容易的,如果在数组前面补第0位加1的话,有可能会遇到进位的情况,使得后面的数全部往后移1位,所以第0位存个位比较好,即倒序存储位上的数。
代码
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
//C = A + B
vector<int> add(vector<int> A, vector<int> B) {
vector<int> C;
int n = A.size(), m = B.size(), t = 0;
for(int i = 0; i < n || i < m; i++) {
if(i < n) t += A[i];
if(i < m) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if(t) C.push_back(t);
return C;
}
int main() {
vector<int> A, B;
string a, b;
cin >> a >> b;
for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //a = "123456" A = [6, 5, 4, 3, 2, 1];
for(int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
vector<int> C = add(A, B);
for(int i = C.size() - 1; i >= 0; i--) cout << C[i];
return 0;
}