高精度加法【c++实现】

其他高精度算法如下:
高精度减法【c++实现】
高精度乘法【c++实现】
高精度除法【c++实现】
——————————————————————————————
说在前面:
众所周知 int,long,long long 的能力是有限制的,具体见下表:
常见数据类型的取值范围
然而现实中的数字是可以非常大的,大到 long long 都装不下,这个时候如果对两个这样的数字进行加减乘除显然是 long long 都无能为力了。欸!那该怎么办呢?
这时候,就到了我们的高精度算法发光发热的时候啦!

这里先说高精度加法的实现:
首先要明确的一点是,高精度加法就是在模拟现实中加法计算的方法而已,用数组的一位存储数字的一位,把两个数字一位一位的相加,当两位数相加再加进位的数字大于等于10的时候就要进位,同时当前位只保留个位数,保证每一位只有一个数字。(可以自己列个竖式感受一下easy

需要解决的一些问题:
例如:976+515=1491
976+515=1491

如果像这个样子存两个数子的话就会发现一个问题,因为我们要保证数组的每一位只有一个数字,那ans的进位没有地方放了啊(总不能不要了吧)
再例如:976+5151=6127
976+5151=6127
这种情况下,因为 num1 和 num2 没有对齐位,所以相加的时候也不好处理 num1 的哪一位加 num2 的哪一位。

解决方法:
976+5151=6127
976+5151=6127
于是乎,我们就要把 num1 和 num2 倒着存进数组里,这样就顺利的解决了对齐问题和进位问题!!【鼓掌】【鼓掌】【鼓掌】

那么现在进入正题:
思路:

  1. 用字符数组接受两个数字(这样子数字就变成了一位一位的了)
  2. 将字符数组倒序转为整形数组进行运算(字符相加可不太好做)
  3. 将结果倒序输出就是答案啦
#include <iostream>
#include <cstring>
using namespace std;

int main(){
	int num1[520]={0},num2[520]={0},ans[520]={0};//自己根据需要定义整形数组的大小 
	int temp,i,j;						//temp是用来存进位的数字的 
	char num1c[520]={0},num2c[520]={0};//接受数字时用的字符数组 
	
	cin>>num1c>>num2c;		//接收两个数字到字符数组(这是还是正向的) 
	
	int len1=strlen(num1c);	//计算num1的长度 
	int len2=strlen(num2c);	//计算num2的长度
	
	//将两个字符型的数字 倒序存到对应整型数组里 (记得减字符‘0’) 
	//数字低位---------------->数字高位 
	for(i=len1-1;i>=0;i--){ 
		num1[len1-1-i]=num1c[i]-'0';
	}
	for(i=len2-1;i>=0;i--){
		num2[len2-1-i]=num2c[i]-'0';
	}
	
	//计算两个数字的和 
	//循环的时候可以全部过一遍,也可以根据两个数字的位数和进位来决定(循环次数会少一些)
	//但我们要充分相信计算机的能力(bushi) 
	for(i=0;i<=520;i++){
		ans[i]=num2[i]+num1[i]+temp;//求和 
		temp=ans[i]/10;//ans[i]如果大于10就进位 
		ans[i]%=10;//ans[i]取个位数 
	}
	
	len2++;//最高位加 1 防止漏掉最后的进位 
	
	//当数字总位数大于1时,去掉开头的0
	//不要全都去掉哦,不然0+0就没有输出了 
	while(ans[len2]==0&&len2>0) len2--; 
	
	//倒序打印出来就是答案了!!!! 
	for(i=len2;i>=0;i--){
		cout<<ans[i];
	}
	
	
}

在这里插入图片描述
结果发现非常成功!!!【撒花】【撒花】【撒花】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值