高精度计算--高精度加法详解


前言

利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度。我们可以利用程序设计的方法去实现这样的高精度计算。计算结果超过常用的数据类型长度即可使用高精度计算。

int范围:[-231,231-1],大约是109数量级。long long范围[-263,263-1],大约是1018数量级。超过这个量级,我们就可以选择高精度计算了。


一、高精度加法分析

1.1 数学的竖式加法计算

在进行高精度加法之前,我们来回顾一下小学时我们是如何进行加法计算的。我们以一个较小的数作为例子:计算12342+432的值。请添加图片描述
我们很容易就能写出上面这个式子,计算的时候一会习惯性的从箭头位置从右往左进行计算得到结果。但是写到程序中还是这样吗?

1.2 数组模拟竖式计算

前面讲了,因为数据已经超过了常用的数据类型,存入过大的数据的时候是有问题的,所以我们在存储输入的数据的时候都是使用数组来完成,现在我们来看一下数组接受数据会发生什么情况。
请添加图片描述
这里增加了下标,我们会发现一个问题,这时候想要计算,他们的下标不是对齐的,我们不能直接直接把0号下标的两个数直接相加。我们希望他们是尾部对齐的效果。那么解决这个问题我们可以先把这两个数组进行逆序(reverse)操作,算完之后再把结果倒序输出即可。顺便加上对应的数组。下图为逆序后做的计算。

请添加图片描述

1.3 计算步骤分析

根据上图,我们分析一下代码步骤。

  1. 创建已知和未知的变量
  2. 程序读取a数组和b数组,并将数组倒置(reverse)
  3. 使用从左往右进行累加计算,并将结果存储到ans数组中。公式:ans[i]=a[i]+b[i];
  4. 将结果逆序输出

二、使用步骤

2.1 代码结构

计算的位数我们设定为小于500位。在写代码的时候我们可以先把我们要做的流程利用函数的形式来表示,具体的实现,等我们想清楚之后再写,这样子写的时候思路更清晰,而且做什么事也不会写乱了。
代码如下(示例):

#include <iostream>
#include <string>
using namespace std;
// 1. 创建变量(包括三个数组、数组的大小N、三个数组的长度,t表示进位)
const int N = 520;
int a[N],b[N],ans[N],len_a,len_b,len_ans,t;
void readDataAndReverse(int *arr,int &len);
void addData(int *a,int *b,int &len_ans);
void reversePrint(int *ans);
int main(){
   
	// 2. 读入数据并倒置
	readDataAndReverse(a,len_a);
	readDataAndReverse(b,len_b);
	// 3. 数组做累加
	addData(a,b,len_ans);
	// 4. 逆序输出
	reversePrint(ans);
	return 0;
}
void readDataAndReverse(int *arr,int &len){
   
	
}
void addData(int *a,int *b,int &len_ans){
   
	
}
void reversePrint(int *ans){
   
	
}

2.2 读入数据并倒置:readDataAndReverse(int *arr,int &len)函数

代码如下(示例):

/*
函数功能:读入数据,并逆序存入数组
参数:
	arr:要存入数据的数组
	len:对应数组的长度
返回值:null
*/
void readDataAndReverse(int *arr,int &len){
   
	
	// 1. 由于数据量比较大,所以我们都是先读入字符串,再转存数组
	string s;
	cin>>s;
	len = s.length(
  • 23
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值