0
点赞
收藏
分享

微信扫一扫

【基础算法】高精度加法

Brose 2022-02-27 阅读 76
算法

算法核心

通过数组表示数字,来大范围地扩充可表示的数值范围

理解

高精度:普通的int、long、long long类型无法满足的数字范围,如11111111111111111111111111111111111111远超普通的数字类型范围,这时候就需要用到高精度

用途

完美解决因数字过大而导致的数值溢出问题

加法核心

a—加数1【由a1,a2,a3....翻转表示,例如数字123就表示为321】

b—加数2【由b1,b2,b3....翻转表示,例如数字456就表示为654】

c—和【由c1,c2,c3....翻转表示】

i—数组下标数

①c[i]+=a[i]+b[i]

②c[i+1]=c[i]/10【起到进位的作用】

③c[i]=c[i]%10【留余】

代码实现

#include <bits/stdc++.h>

using namespace std;

const int num=1e5;
char ca[num],cb[num];
int a[num],b[num];

void demo(char n1[],char n2[]){
	int len1=strlen(n1),len2=strlen(n2);
	int c[num];
	int len=len1>len2?len1+1:len2+1;//两数之和的位数最多为较大数位数加1 
	for(int i=1;i<=len1;++i){
		a[i]=n1[len1-i]-'0';
	} 
	for(int i=1;i<=len2;++i){
		b[i]=n2[len2-i]-'0';
	}
	for(int i=1;i<=len;++i){
		c[i]+=a[i]+b[i];
		c[i+1]=c[i]/10;
		c[i]=c[i]%10;
	}
	while(c[len]==0){//删除前导0 
		len--;
	}
	for(int i=len;i>0;--i){//转置输出和数组 
		cout<<c[i];
	}
} 

int main(){
	cin>>ca>>cb;
	demo(ca,cb);
	return 0 ;
}
//测试数据1 	000000001784697516584561854814863548156246100
//测试数据2 	00000001458767164516745617800
//测试结果 		1784697516584563313582028064901863900
举报

相关推荐

0 条评论