洛谷题单指南-模拟和高精度-P1601 A+B Problem
原题链接:https://www.luogu.com.cn/problem/P1601
题意解读:本题是高精度加法的模版题。
知识点解析:
高精度加法:
如果一个数大到远超过整形变量的范围时,就不能使用int、long、long long等变量来存储整数,也不能直接通过变量加法来求和。
因此,需要回到加法计算的本质,从个位开始,逐位相加,即可求得结果,要实现该操作,需要解决几个关键问题:
1、 整数的存储
要实现逐位相加,必须将数的每一个数字拆解出来,用数组存储,实际编程中,用vector更方便。
比如:数字12345存储到vector中,是将数字当做string来处理,从后往前遍历,依次提取数字存入vector
string a = "12345";
vector<int> aa;
for(int i = a.size() - 1; i >= 0; i--)
aa.push_back(a[i] - '0');
2、加法操作
逐位相加时,当前位的结果是两个数字相加%10,再加上上一位的进位,举例:
计算12345 + 789
12345存储为{5, 4, 3, 2, 1}
789存储为{9, 8, 7}
个位在前是为了便于优先计算个位,另外定义一个vector数组用来存储结果,初始值{ }
第一步:计算5 + 9 = 14,当前位的结果是14 % 10 = 4,本次进位是14 / 10 = 1,
此时结果为{4}
第二步:计算4 + 8 = 12, 当前位的结果是12 % 10 + 上一次的进位 = 3,本次进位是12 / 10 = 1,
此时结果为{4, 3}
第三步:计算3 + 7 = 10, 当前位的结果是10 % 10 + 上一次的进位 = 1,本次进位是10 / 10 = 1,
此时结果为{4, 3, 1}
第四步:12345计算到2了,789各个数字都已计算完,因此当前位的结果是2 % 10 + 上一次的进位 = 3,本次进位是2 / 10 = 0,
此时结果为{4, 3, 1, 3}
第五步:12345计算到1了,789各个数字都已计算完,因此当前位的结果是1 % 10 + 上一次的进位 = 1, 本次进位是1 / 10 = 0,
此时结果为{4, 3, 1, 3, 1},转成数字即13134。
3、收尾
最后一次数字计算之后,要判断进位,如果进位是0,则当前结果即最终结果,如果进位是1,则结果数组还需要加入1,
举例:计算56 + 78
第一步计算6 + 8,结果4,进位1,当前和的结果{4};
第二步计算5 + 7,结果3,进位1,当前和的结果{4, 3};
数字全部计算完毕,进位是1,当前和的结果是{4, 3, 1},转成数字即134。
100分代码:
#include <bits/stdc++.h>
using namespace std;
vector<int> add(vector<int> a, vector<int> b)
{
vector<int> res; //结果
int t = 0; // 进位
int len = max(a.size(), b.size());
for(int i = 0; i < len; i++)
{
if(i < a.size()) t += a[i];
if(i < b.size()) t += b[i];
res.push_back(t % 10);
t = t / 10;
}
if(t) res.push_back(t);
return res;
}
int main()
{
string a, b;
cin >> a >> b;
vector<int> aa;
vector<int> bb;
for(int i = a.size() - 1; i >= 0; i--) aa.push_back(a[i] - '0');
for(int i = b.size() - 1; i >= 0; i--) bb.push_back(b[i] - '0');
vector<int> result = add(aa, bb);
for(int i = result.size() - 1; i >= 0; i--) cout << result[i];
return 0;
}