高精度算法(加法)

本文一部分内容参考了wmy0217_博主

目录

导语

1.什么是高精度算法

2.高精度加法的思路

3.真题讲解(洛谷【算法1-1】模拟与高精度,P1601)

题目描述

输入格式

输出格式

输入输出样例

说明/提示

4.总结


导语

在日常编程中,我们难免会遇到一些庞大的数字计算,由于C++中自带的数据类型有储存范围,有些庞大的数字会超出储存范围,从而无法计算,所以,我们只能用一种算法去进行这种计算——高精度算法

1.什么是高精度算法

所谓高精度算法,就是模拟数据的计算过程,一般采用数组或容器来储存这些数据,今天只介绍高精度加法(因为本人目前只会这个)。例如:123。定义一个数组a,将123从低位到高位依次储存在数组中,也就是a[0]=3,a[1]=2,a[2]=1

2.高精度加法的思路

当我们将数据储存好后,接下来就是计算。最简单的就是直接将两个数的每一位进行相加,然后输出,例如21+32=53;但加法是可以进位的,所以我们需要定义一个变量t,用来管理加法的进位,并且还需要定义两个字符型变量a,b,分别为两个加数和相加的和,然后定义三个vector类型的容器A,B,C(对于不了解vector类型的,可以参考这个链接C++ vector的用法(整理)-CSDN博客,A,B为两个加数,C为相加的和。接着编写一个函数,这也是整个算法的核心,稍后会展示代码。最后,就利用循环将C容器输出,高精度加法也就完成了

3.真题讲解(洛谷【算法1-1】模拟与高精度,P1601)

题目描述

高精度加法,相当于 a+b problem,不用考虑负数

输入格式

分两行输入。a,b≤10^500。

输出格式

输出只有一行,代表 a+b 的值。

输入输出样例

输入 #1

1
1

输出 #1

2

输入 #2

1001
9099

输出 #2

10100

说明/提示

20% 的测试数据,0≤a,b≤10^9;

40% 的测试数据,0≤a,b≤10^18。

上代码(代码参考了wmy0217_博主

#include<iostream>
#include<vector>
using namespace std;     //这些应该不用多说了
string a,b;     //定义a,b字符型变量,为两个加数
vector<int> JF(vector<int> &A,vector<int> &B){  //vector&会对原始数据产生更改,vector不会,两者注意区分
	int t=0;    //用来管理进位
	vector<int> C;
	for(int i=0;i<A.size() || i<B.size();i++){    //如果下标大于A容器或B容器长度,就停止循环,这样有助于两数相加
		if(i<A.size()){    //如果下标小于A容器长度,就让t加上A[i]
			t+=A[i];
		}
		if(i<B.size()){    //同上
			t+=B[i];
		}
		C.push_back(t%10);    //如果t>=10,就只将它的个位插入进C容器末尾,否则直接将t插入
		t=t/10;        //使t为0或1,判断是否需要进位
	}
	if(t){    //如果在两数最高位相加后t为1,就在C容器末尾插入1,进行进位
		C.push_back(1);
	}
	return C;      //返回C容器
}
int main(){
	cin>>a>>b;
	vector<int> A,B;    //定义容器A,B,用来储存两个加数
	for(int i=a.size()-1;i>=0;i--){      //将两个加数分别储存进两个容器
		A.push_back(a[i]-'0');         //push_back()函数是在容器末尾插入元素,括号里可以填元素值
	}
	for(int i=b.size()-1;i>=0;i--){     //同上
		B.push_back(b[i]-'0');
	}
	vector<int> C=JF(A,B);      //进行高精度算法
	for(int i=C.size()-1;i>=0;i--){      //将结果输出
		cout<<C[i];
	}
	return 0;
}

这里也有一个我自己写的代码,用数组计算的,我认为我写得比较麻烦,如果有可以优化的地方请私信,因为感觉和上一个代码的思路差不多,所以就不多做解释了,这里选用数组空间1001,可根据实际情况更改

#include<iostream>
using namespace std;
int C[1001];
int main(){
	string a,b;
	cin>>a>>b;
	int A[a.size()],B[b.size()];
	int num1=0;
	for(int i=a.size()-1;i>=0;i--){
		A[num1]=int(a[i]-'0');
		num1++;
	}
	num1=0;
	for(int i=b.size()-1;i>=0;i--){
		B[num1]=int(b[i]-'0');
		num1++;                   //这里和上一个代码的主函数里的代码作用一样
	}
	int t=0,num=0;
	for(int i=0;i<a.size() || i<b.size();i++){
		if(i<a.size()){
			t+=A[i];
		}
		if(i<b.size()){
			t+=B[i];
		}
		C[num]=t%10;
		num++;
		t=t/10;
	}                          //这里也是一样
	if(C[num]==0){
		num=num-1;
	}
	if(t){
		C[num+1]=1;
		num=num+1;           //这六行注意一下,这里的前三行代码的作用是消除前导0,后四行的作用是进位
	}
	for(int i=num;i>=0;i--){
		cout<<C[i];
	}
	return 0;        //收尾
}

4.总结

高精度算法是一种常用算法,生活中或者参加竞赛都会有它的身影,由此可以看出它的重要性,本文只讲解了高精度加法,以后会陆续发布高精度其他运算的解析

本文如有错误,请各位批评指出,本人第一次发布文章,一些流程有点不熟练,敬请见谅,另外,本人为初中生,最近正在准备月考和竞赛,如有消息未能及时回复,也请原谅,谢谢

如有侵权行为,请告知,本人会及时将此文章进行处理

感谢观看!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值