A+B problem(高精度加法)

题意

给定 2 2 2个数 a a a, b b b( a , b ≤ 1 0 500 a,b \leq 10^{500} a,b10500 ),输出它们相加的结果。

思路

因为 a , b ≤ 1 0 500 a,b \leq 10^{500} a,b10500,所以我们不能直接进行运算。这个时候我们就可以使用高精度加法来进行运算。

高精度加法

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 
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

你可能感兴趣的:(算法,算法,c++,开发语言)