高精度加法
题目链接
https://www.acwing.com/problem/content/793/
思路
-
输入的时候使用字符串string存储
-
将char类型转换成int类型,使用
vector<int>
逆序存储 -
模拟手算加法的过程
-
判断位数,循环最大位数
-
定义一个累加器 t
-
每一次循环
t += A[i]
因为A始终是最大位数,但是在累加B[i]
的时候要判断当前位数是否小于B的位数,如果小于才相加。 -
每次结果都取
t%10
,并且t /= 10
如果t大于时则t会等于1,进位1,如果t小于10,则t等于0,不进位 -
最后判断t是否为1,如果为1,则要进位1,
举例:
88 + 12 相同位数,但是只循环2位数,但是结果是3位数,所以要判断最后t是否需要进位
-
-
逆序输出
所有的循环都是逆序的,除了函数里面的循环
代码
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
vector<int> sum(vector<int> A, vector<int> B)
{
if(A.size() < B.size())return sum(B,A);
vector<int> C;
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%10);
t /= 10;
}
if(t) C.push_back(1);
return C;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> A,B;
for(int i = a.size()-1; i >= 0; i-- )A.push_back(a[i] - '0');
for(int i = b.size()-1; i >= 0; i-- )B.push_back(b[i] - '0');
vector<int> C = sum(A,B);
for(int i = C.size() -1 ; i >= 0; i--)printf("%d",C[i]);
printf("\n");
return 0;
}
i >= 0; i--)printf("%d",C[i]);
printf("\n");
return 0;
}