//高精度算法-加法
#include <iostream>
#include <string>
#include <vector>
#include<cmath>
using namespace std;
int main()
{
//s1 数字1 s2 数字2 a1 数字1的各个位逆着存储 a2 同a1原理一致 a3即后续模拟加法的存储数组
string s1, s2;
int a1[200], a2[200], a3[200] = { 0 }; // 200作用于你要的高精度加法中2个数字的长度 所以不要输入诸如300个1组成的111....111 除非你改动上面的数组数量QAQ
getline(cin, s1); getline(cin, s2); // 加法的2个数的输入
for (int i = 0; i < s1.size(); i++) {
a1[s1.size()-1-i] = s1[i]-'0'; //倒着放置 模拟竖式加法需要
}
for (int i = 0; i < s2.size(); i++) { // 方法依旧
a2[s2.size() - 1 - i] = s2[i] - '0';
}
int len = s1.size();
if (s2.size() > s1.size()) { // 找以下这2个数的最长长度 竖式加法需要用到
len = s2.size();
}
for (int i = 0; i < len; i++) { //len必须是最长的那个字符串 加法就是这样
a3[i] = a1[i] + a2[i]; // 两个数的每一个位上的数字相加
}
for (int k = 0; k < len; k++) { // 因为我们给a3有200个初始化元素 但并不是每个都用的上的 所以直接用len 即长度最长的有效元素数量
if (a3[k] >= 10) {
a3[k + 1] += a3[k] / 10; //比如2数个位相加 10+21=31 所以/10之后就是3 这个3就是要加到十位上的
a3[k] = a3[k] % 10; // 当31被拿掉3后 也就是被拿掉了3*10 你会发现其实就是与10取余的结果 即31 % 10 = 1 获得个位
}
}
if (a3[len] != 0) {
len++; //因为a3的初始化是所有元素为0
//而99+2的结果是101 是个三位数 所以是a3代表的数字长度需要增加
//抽象表达: 此时的a3=[11 9 0 0 0 0....]
//11分出去一个十位 所以这时a3=[1 10 0 0 0 0 0....]
//十位上是10 所以需要进1 所以a3=[1 0 1 0 0 0 0 0....]
//len为还未计算时的结果默认长度,但是我们经过竖式加法过程之后,可能就会出现,99 + 2 相加结果最高长度增加1位的情况
//即原本数字长度最高为2 但是结果计算后 99 + 2 为三位数了 加了1位 所以len++
//为什么是a3[len] != 0 因为数组从0计数
}
for (int i = len - 1; i >= 0; i--) {
cout << a3[i];
}
return 0;
}
高精度加法 用于解决加法问题 如超过long long 数据类型所能承受的最大数字之间的加法.
比如222222222222222222222222222222222222222222222+22222222222222222222222222222
理解方法我已通过注释表达A.A