首页 > 其他分享 >高精度加法的实现

高精度加法的实现

时间:2024-06-08 09:01:54浏览次数:22  
标签:计算 高精度 实现 int 数组 加法 字符串

         这是C++算法基础-基础算法专栏的第七篇文章,专栏详情请见此处


引入

        在C++语言中,int的可存储数据范围是-2147483648~2147483647,long long的可存储数据范围是-9223372036854775808~9223372036854775807,但是如果一些数据比long long的可存储数据还要大时,我们就不得不使用别的方法去储存与计算了,这种方法就是高精度计算。

        下面我们就来讲高精度加法的实现。

定义

        高精度计算(Arbitrary-Precision Arithmetic),也被称作大整数(bignum)计算,运用了一些算法结构来支持更大整数间的运算(数字大小超过语言内建整型)。

前置过程

        这里我们用数组来实现高精度计算。

        清除

        先做一个简单的清除数组的操作。

void clear(int a[]){
	for(int i=0;i<L;i++)
		a[i]=0;
}
        输入与储存 

        高精度计算数字的规模太大了,需要输入一个字符串,再把它放进数组里。

Q:怎样字符串转化为数组呢?

A:字符串的每一位都是字符,若想把它转化为数组,就需要用ASCII码进行偏移操作,将此字符减去‘0’。

        还有一个问题,读入字符串时,数字最高位在字符串首(下标小的位置)。但是实际我们习惯在下标最小的位置存放数字的个位,即存储一个反转的字符串

Q:为什么要存储一个反转的字符串呢?

A:这么做是因为两个数进行运算时通常从个位开始,且运算时数字的长度也有可能发生变化,但我们希望同样个位始终保持对齐,所以反转存储是最好的方式。

        下面给出高精度计算的读入与储存代码:

void read(int a[]){
	cin>>s;
	int L=s.size();
	for(int i=0;i<L;i++)
		a[i]=s[L-1-i]-'0';
}
        输出

        输出一个数组没什么难的,但在高精度计算中,我们不希望将数组中的前导零输出,故需要从最高位开始向下寻找第一个非零的位置,从这里开始输出。

        你会发现在代码中,终止条件是i >= 1而不是i >= 0,这是因为若这个数字本身就是0,则需要输出个位

        下面给出高精度计算的输出代码:

void print(int a[]){
	int i;
	for(i=L-1;i>=1;i--){
		if(a[i]!=0)
			break;
	}
	for(;i>=0;i--)
		cout<<a[i];
	cout<<endl;
}

主体过程

        高精度加法的原理和小学学习的竖式加法是一样的。

        概括来说,从个位开始,将两个加数相对应的每一位相加,存进和的对应位置上,若当前位达到10进位,也就是将下一位加1,并把当前位减10

        123+89用高精度计算,先加个位,3+912,发现12大于等于10,所以将1210,得2,将其存入答案的个位,将十位加1

        再加十位,1+2+811,发现11大于等于10,所以将1110,得1,将其存入答案的十位,将十位加1

        最后加百位,1+1+02,发现2不大于等于10,所以直接将2存入答案的百位。得到答案212

        下面给出高精度加法的代码:

void add(int a[],int b[],int c[]){
	clear(c);
	for(int i=0;i<L-1;++i){
		c[i]+=a[i]+b[i];
		if(c[i]>=10){
			c[i+1]+=1;
			c[i]-=10;
		}
	}
}

上一篇-浮点数二分查找的实现    C++算法基础专栏文章    下一篇-高精度减法的实现


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

标签:计算,高精度,实现,int,数组,加法,字符串
From: https://blog.csdn.net/wyuchen123/article/details/137520142

相关文章

  • 【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重
    目录一、日期类的实现Date.h 1.1GetMonthDay函数(获取某年某月的天数) 问:这个函数为什么不和其他的函数一样放在Date.cpp文件中实现呢?1.2CheckDate函数(检查日期有效性)、Print函数(打印日期)1.3实现日期类的逻辑运算符重载<运算符的重载 ==运算符重载其他运算符重载......
  • ShardingSphere + Mysql,实现分库分表、读写分离,并整合 SpringBoot
    软件版本Docker:26.1.3Mysql:8.4.0ShardingSphere:5.5.0 分库分表1.Docker创建两个Mysqlservices:mysql:image:mysql:8.4.0ports:-"3306:3306"environment:MYSQL_ROOT_PASSWORD:abc123volumes:-./data:/var/lib/mysql......
  • 算法分析与设计实验一、分治策略实现大整数乘法
    目录实验目的和要求实验环境实验内容与过程 实验内容关键代码 流程图实验结果与分析(实验结果截图)结果分析:实验心得实验目的和要求分治策略实现大整数乘法。设计并使时间复杂度为O(n1.59)。实验环境Windows11Pycharm2021实验内容与过程 实验内容对输入的......
  • soket 利用http实现验证码的发送
    soket利用http实现验证码的发送在C语言中,可以直接使用socket的TCP连接来实现HTTP协议发送验证码的功能会涉及到底层的网络通信编程。以下是一个简化的步骤和示例代码,如何使用socket在程序中向互亿无线官方中发送HTTPPOST请求来让手机获取验证码。详情可以去官网下载API文档了......
  • 【BP时序预测】基于鱼鹰算法OOA优化BP神经网络实现温度数据预测算法研究附matlab代码
    以下是一个大致的步骤和MATLAB代码框架:数据准备:准备用于训练和测试的温度数据集。初始化BP神经网络:定义神经网络的结构(如隐藏层的数量和每层的神经元数量)。定义适应度函数:这是优化算法的目标函数,它应该根据神经网络的预测性能(如均方误差MSE)来评估神经网络的权重和偏置。......
  • 简单几步,用Python实现VPN搭建
    保护个人隐私和数据安全变得尤为重要。VPN(虚拟私人网络)是一种有效的解决方案,可以帮助我们在网络上匿名浏览,保护数据传输的安全性。虽然市面上有许多商业VPN服务,但你也可以通过Python自己搭建一个简单的VPN。本文将介绍如何用Python建立自己的VPN。基本原理VPN的工作原理是......
  • 使用itextPDF实现PDF电子公章工具类
    使用itextPDF实现PDF电子公章工具类一、制作公章在线网站:印章生成器-Kalvin在线工具(kalvinbg.cn)然后对公章进行下载保存盖章图片:二、生成数字签名2.1:java工具keytool生成p12数字证书文件Keytool是用于管理和证书的工具,位于%JAVA_HOME%/bin目录。使用JDK的keytool......
  • 【算法】深入浅出爬山算法:原理、实现与应用
     人不走空                                           ......
  • #A. C08.L01.高精度加法与减法.概述
    一、高精度运算什么是高精度运算?我们都知道,数据类型是有大小范围的。整型数据int能表示的数的范围为:-2147483648至2147483647(-2^31至2^31-1)长整型数据longlong能表示的数的范围为:-9223372036854775808~9223372036854775807(-2^63至2^63-1)。那么当所要求解的数的大小还要......
  • C++STL---list模拟实现
    本文我们模拟实现STL中的list,为了模拟实现list,实际上我们需要实现三个类,分别为:_list_node,_list_iterator,list。我们先看一下这三个类的基本组成,主要是看看每个类中包含的变量有什么:namespaceCYF{ //模拟实现list当中的结点类 template<classT> struct_list_node......