高精度加法,相当于a+b problem,不用考虑负数.
分两行输入。a,b \leq 10^{500}a,b≤10500
输出只有一行,代表a+ba+b的值
输入 #1复制
1 1
输出 #1复制
2
输入 #2复制
1001 9099
输出 #2复制
10100
这是一道非常经典的高精度的题目。高精度,一般是将我们所使用的计算机模拟超过计算机计算上限的加减乘除
这道题目我们就只是模拟大数的加法
我们先想象一下我们平时所使用的加法是如何计算的 , 这里我先用文字简单说一下,首先个位加个位 , 十位数字加十位 , 百位加百位。这样依次加到最后一位,当然在过程中不免会遇到需要进位的,这应该算是这道题目最难解决的问题了。
现在我们来看一下这道题目的难点,首先应该读取数字,可以知道我们的长整形都无法存储,所以我们只能使用字符串来存储,但是我们执行个位,十位,百位相加的时候是需要用数字来进行计算的,所以我们这里需要一个转换。
2、我们的进位,尤其是在最高位上的进位,例如1 + 9,我们应当如何去判断。
3、两个数字相加的位数如果不同 , 这时应当怎么进行计算
大家可以仔细想一想 ,现在我们在coding吧
string a, b;
cin >> a >> b;
这里我们读取字符串
vector p, q;
vector c;
储存两个转换成数字 , 我们打算使用动态数组进行存储,并且打算用c来存储答案。
//动态数组不太清楚的可以开一个足够题目范围的一般数组,效果是一样的
这里我们需要进位 , 所以我们应该从个位数向高位数依次存储这样可以方便我们进位
for (int i = a.size() - 1; i >= 0; i--) {
p.push_back(a[i] - '0');
}
for (int i = b.size() - 1; i >= 0; i--) {
q.push_back(b[i] - '0');
}
现在我们将两个字符串依次存入两个动态数组,这里数字减去‘0’(字符0)这是将字符转化为整形并且存入数组。
现在我们要开始实现我们的加法了
vector add(vector p, vector q) {
int t = 0 , i = 0;
vector c;
这里我们打算用 t 来进行对进位的判断。思路是这样的:我们每次在实施每一位数相加的时候再加上一个 t ,最后%10,应该就是我们的这个位上的数字了,t可以自己/10,表示进位,这里可以举个例子,
15 + 438,这里个位加个位 t = 5 + 8 = 13,13%10 = 3,所以个位数字就是3 , t现在是1 ,所以1就是我们所需要的进位, 这里再看十位,十位是1 + 3 + 1(t所表示的进位)此时t = 5,所以我们所得到 t%10 = 5 也就是十位 , 百位此时是4, 4+t,15的百位没有数字 , 所以我们不需要看15百位。
while (i < p.size() || i < q.size()) {
if (i < p.size()) t += p[i];
if (i < q.size()) t += q[i];
c.push_back(t % 10);
i++;
t /= 10;
}
所以这里可以这样写。但是如果最后一位需要进位怎么办 , 比如说99+1,这两样是没办法算出百位的1的,所以这时候又需要关键的 t 了,如果最后t还是1的话,就再在最高位添加一个1就行了
if (t) {
c.push_back(1);
}
至此,这道题目的所有难点都讲完了 , 如果有需要全部代码的,我放在下面了 , 大家尽量不要复制 , 如果有不会的地方可以私信也可以评论 , 我也会给大家回复
#include
#include
#include
using namespace std;
vector add(vector p, vector q) {
int t = 0 , i = 0;
vector c;
while (i < p.size() || i < q.size()) {
if (i < p.size()) t += p[i];
if (i < q.size()) t += q[i];
c.push_back(t % 10);
i++;
t /= 10;
}
if (t) {
c.push_back(1);
}
return c;
}
int main() {
string a, b;
cin >> a >> b;
vector p, q;
vector c;
for (int i = a.size() - 1; i >= 0; i--) {
p.push_back(a[i] - '0');
}
for (int i = b.size() - 1; i >= 0; i--) {
q.push_back(b[i] - '0');
}
c = add(p, q);
for (int i = c.size() - 1; i >= 0; i--) {
cout << c[i];
}
return 0;
}