高精度加法详解

高精度加法详解

对于加法学过编程的都知道,不过如果数据非常的大,大到无法用long long 这个数据类型储存,,特别是在这个大数据时代,这样的情况时有发生。这个时候就需要高精度算法来解决。

算法基本思想:

其实也很简单,首先,既然普通的数据类型不够大,那么我们干脆用数组来存储,这样就解决了数据溢出的问题。其次,要怎么进行计算呢?就是用小学学加法时候的笔算用代码表示出来。比如小学计算947+34=?这个问题时:

如此,只要数组足够大,多大的数据我也可以计算出来。

算法描述:
  • 定义三个字符数组a,b,分别用来存储两个加数,定义一个temp来存储进位,且初始化为0,定义一个整数数组存储和。
  • 字符数组转换成整数数组A,B。
  • A[0]是个位,A[1]是十位,以此类推b。(B数组也是如此)
  • 个位相加即A[0]+B[0]+temp(初始化为0不会影响)=C[0],如果有进位(和是两位数),则把进位(和的十位)存储在temp中,个位存储在C[0]。
  • 十位相加即A[0]+B[0]+temp=C[0],如果有进位(和是两位数),则把进位(和的十位)存储在temp中,个位存储在C[0]。
  • 一直加下去,得出结果。
接着就是代码实现:
#include <iostream>
#include <cstring>
using namespace std;
int A[100000],B[100000],C[10000000],temp=0,lena,lenb,lenc;
char a[1000000],b[10000000];//因为数组太大尽量都定义在main函数外面。 
int main(){
	cin>>a;
	cin>>b;
	lena=strlen(a) ;//计算长度 
	lenb=strlen(b);
	for(int i=0;i<lena;++i)
	A[i]=a[lena-1-i]-'0';
	/*
	将字符数组变成整数数组,并且将数组倒转。
	为什么要倒转呢?
	因为一开始输入时,高位在前,只有倒转以后才可以做到低位在前 。
	例如输入100,200;
	在a,b中存储时100,200;
	倒转以后在A,B中就时001,002;
	方便计算 
	*/ 
	for(int i=0;i<lenb;++i)
	B[i]=b[lenb-1-i]-'0';
	lenc=lena>lenb?lena:lenb;//得到较长的一个数
	for(int i=0;i<lenc;++i) 
	{
		C[i]=A[i]+B[i]+temp;
		temp=C[i]/10;
		C[i]%=10;
	}
	if(temp!=0)//看最后是否temp为0。并进行分类处理 
	{
	C[lenc]=temp;
	for(int i=lenc;i>=0;--i)
	cout<<C[i];
	return 0;
	}
	for(int i=lenc-1;i>=0;--i)//先输出高位 c
	cout<<C[i];
	return 0;
}
洛谷练习题:

https://www.luogu.com.cn/problem/P1601

题目描述

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

输入格式

分两行输入。a,b≤10500a,b \leq 10^{500}a,b≤10500

输出格式

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

输入输出样例
输入 #1
1
1

输出 #1

2

输入 #2

1001
9099

输出 #2

101
  • 17
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值