题意
给定 2 2 2个数 a a a, b b b( a , b ≤ 1 0 500 a,b \leq 10^{500} a,b≤10500 ),输出它们相加的结果。
思路
因为
a
,
b
≤
1
0
500
a,b \leq 10^{500}
a,b≤10500,所以我们不能直接进行运算。这个时候我们就可以使用高精度加法
来进行运算。
高精度加法
1.通俗的来讲,高精度算法其实就是模拟竖式进行运算
。
如1236+12345:
1 2 3 4 5
1 2 3 6
-------1--
1 3 5 8 1
在其中我们可以发现要这个模拟运算
需要解决两个问题
1.如何将两个数的每一位对齐
。
2.如何解决进位
。
3.用什么类型(int,long long,string,char…)去存储它。
解决问题的思路
1.将两个数的每一位对齐可以通过倒序
(原序:1-n,倒序:n-1)来完成。
2.解决进位可以用模运算
和除运算
来解决:
进位=
n
o
w
10
\frac{now}{10}
10now(
n
o
w
now
now为当前的数,此运算的意思是取
n
o
w
now
now的十位上的数
)
n
o
w
1
=
n
o
w
%
10
now1=now\%10
now1=now%10(
n
o
w
1
now1
now1为更改后的当前的数,此运算的意思是取
n
o
w
now
now个位上的数
)
3.可以先用字符串(string)进行输入,在转化为数组(每一位只存0-9,所以int就够了)
code↓
#include <bits/stdc++.h>
using namespace std;
string s,t;
int f[200005][5];
int cheng(){
int x=s.length();//x表示s的位数,s.length()是用来求s的长度的函数
int y=t.length();//y表示t的位数
for(int i=0;i<x;i++) f[x-i][1]=s[i]-'0';// 倒序,f[x]=s[0],f[x-1]=s[1]....f[1]=s[x-1]
for(int i=0;i<y;i++) f[y-i][2]=t[i]-'0';//从0开始是因为string的存储是从0开始的
int o=0,jw=0;//jw是进位的意思,o表示位数:1,2,3,4,5....
while(o<=x||o<=y){//知道将两个数的所有位数都运算后结束,等同于while(o<=max(x,y))
o++;//位数不断加1
f[o][3]=f[o][1]+f[o][2]+jw;//f[o][3]是最后的答案。
jw=f[o][3]/10;//f[o][3]=第一个数的第o位+第二个数的o位+进位
f[o][3]%=10;//为了保证f[o][3]不超过10,所以需要将f[o][3]%10
}
if(f[o][3]==0) o--;//去掉前导0
for(int i=o;i>=1;i--){
cout<<f[i][3];//输出
}
return 0;
}
int main(){
cin>>s>>t;//使用字符串类型进行输入
cheng();//调用函数
return 0;
} 完结撒花O(∩_∩)O