A+B problem(高精度加法)

本文介绍了解决大数加法问题的高精度加法算法,包括对齐数字、处理进位的方法,以及使用C++中的字符串和整数数组进行操作的代码示例。
摘要由CSDN通过智能技术生成

题意

给定 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 <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
  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花火Spark

鼓励,如星光,照亮我创作的前路

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值