数据结构与算法-高精度加法

一.高精度加法

1.概念

高精度:处理位数较大的数学计算方法。

低精度:处理位数较低的数学计算方法。

高精度加法:高精度 + 高精度

2.存储大小的问题

int :100+10^9

“+”号右边部分可以存储到10的9次方。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int num=100+pow(10,9); 
    cout<<num;
	return 0;  
}

输出样例:1000000100


long :10^18

它可以存储到10的18次方。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    long long num=pow(10,18);
    cout<<num;
	return 0;  
}

输出样例:1000000000000000000

3.进位问题

类似于小学的加法运算,例如11+29

4.补0问题

例如1111+22,程序运算时要补0,例如1111+0022

5.处理进位溢出的问题

例如611+744,相加出来的结果是四位数,这种情况明显是长度不够用了,所以我们需要更新长度,即长度+1。

6.总结

①用数组存储数字:以倒着存的方式进行运算,解决了很多的问题。

例如1234+23 → 1234+0023 → 4321+3200 。

②数组长度+数组 → 可以维护一个高精度大数。

二.代码

题目描述:输入两个高精度大数,进行相加的运算。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    //存储大整数且输入 
    char str1[205]={0},str2[205]={0};
    int num1[205]={0},num2[205]={0};
    cin>>str1>>str2;
    
    //获取字符串长度 
    int len1=strlen(str1);
    int len2=strlen(str2);
   
    //字符串倒序,将每一个数放到整型数组之中 
	for(int i=1;i<=len1;i++){
		num1[i]=str1[len1-i]-'0';
	} 
	for(int i=1;i<=len2;i++){
		num2[i]=str2[len2-i]-'0';
	} 
    //获取最大的长度 
	int len=max(len1,len2);
	//低位往高位运算 
	for(int i=1;i<=len;i++){ 
		num1[i]=num1[i]+num2[i]; //位数相加 
		num1[i+1]=num1[i+1]+num1[i]/10; //更新进位 
		num1[i]=num1[i]%10; //保留位数 
	} 
	
    int flag=0;
    //倒着遍历
	//如果进位溢出,就需要更新长度,即len+1 
    for(int i=len+1;i>=1;i--){
    	//处理前导0 
    	if(num1[i]!=0){  //最前面的位数不等于0 
    		flag=1;  //标记为1 
		} 
		if(flag==1){  
			cout<<num1[i];
		}
	}
	return 0;  
}

输入样例:
     22222222222222222222
     33333333333333333333
输出样例:
     55555555555555555555


输入样例2:
     134
     866
输出样例2:
     1000


三.解题思路

①存储大整数,并且输入。定义存储字符串的数组和存储数字的数组。

②获取字符串长度

③字符串倒序,将每一个数放到整型数组之中。

④获取最大的长度。

⑤从低位往高位运算。进行 位数相加更新进位保留位数 的操作。

⑥定义flag变量,将值初始化为0。

⑦倒着遍历。如果进位溢出,就需要更新长度,即 len+1。

我们还需要处理前导0的问题,最前面的位数不等于0,就可以标记为1,再利用标记进行后面数字的输出。

四.图形解释

模拟法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值