高精度加法与减法.概述

高精度算法——高精度减法 高精度减法也同加法一样,也是用于位数太大的运算,给你一个十几位的数你可能会做直接开个long long 的数据类型就解决了,但是给你一个100位的呢,1000位的呢,开long long 也不够了,所以就要用高精度了,也就是高精度算法就是处理位数很大数据。 如果你对高精度加法也不是很熟悉你可以看这个(高精度算法——高精度加法... 阅读详情

啊,哈喽,小伙伴们大家好。我是#张亿,今天呐,学的是高精度加法与减法。

一、高精度运算

什么是高精度运算?我们都知道,数据类型是有大小范围的。

  1. 整型数据 int 能表示的数的范围为:-2147483648至2147483647(-2^31至2^31-1)
  2. 长整型数据 long long 能表示的数的范围为:-9223372036854775808~9223372036854775807(-2^63至2^63-1)。

那么当所要求解的数的大小还要再大时,就不能使用上述的方式存储数据进行运算。此时我们可以使用高精度运算进行解决。

二、高精度加法

高精度加法,实际上就是我们从加法的定义出发,利用数组表示每一位,通过“竖式运算”的方式进行进位相加,最终得出答案。为了保证数字的连贯,我们可以使用字符串或字符数组来表示,之后再利用相应的ASCII码值进行转换即可。

  1. 先定义两个字符串
string a,b; //使用字符数组,则是已知数据的长度,若不清楚可采用字符串
cin>>a>>b; //注意这个时候我们输入的数字就用字符串来表示了

想想我们列竖式计算加法时的思想是怎样的:将两个数字对应的个,十,百...位都对齐进行相对应的加法计算,满10就进1,不满则不进。从个位开始对齐,如果因为两个数字 的位数不同而导致其中一个数字的高位没有对应的数字对齐,那么我们就要在另一个数字对应的位置上进行空位补0。因此,我们需要先得到两个字符串中较长的字符串长度作为边界条件,然后进行补0操作:

既然我们已经用字符数组的形式将数字表示了出来,那我们就可以利用取对应下标的方法将对应的数字进行相加。但我们要注意一个问题:我们通常的列竖式加法运算是从末尾开始逐次相加,对应到我们的字符数组中,我们就要得到两个字符数组中较长的作为边界条件,来写这个for循环。

  1. 判断两个数的长度,将较短的数放置到字符串 a 中,然后进行高位补 0
if(a.size()>b.size() swap(a,b);

int aa=a.size(),bb=b.size(); //注意需要提前用变量记录两个字符串的长度,不可以在for循环中直接使用size()函数

for(int i=1;i<=b.size()-a.size();i++)
	a='0'+a;

  1. 补0操作使得每一位数字都能够对齐后,我们就可以开始进行加法的操作:
for(int i=a.size()-1;i>=0;i--)
	a[i]=(a[i]-48)+(b[i]-48); //将字符转成数字后参与运算,然后存储到a[i]中,注意此时存储在字符串里的是答案数字

  1. 处理进位问题

两个数相加后有可能超出10,此时我们需要向前进位。因此接下来我们要进行进位的判断与操作。特别需要注意的是,如果最高位也需要再进一位时,我们在最后输出之前需要添加进位后的数字“1”在答案字符串之前。

for(int i=a.size()-1;i>=1;i--)
{
	if(a[i]>=10)
	{
		a[i-1] += a[i]/10; //先进位
		a[i]% = 10; //进位后剩余的数字
	}
}

如果最高位需要进位,那么先将进位的答案求出,然后处理a[0]的答案,最后将进位的答案放在最前面连接

if(a[0]>=10)
{
	char t=a[0]/10;
	a[0]%=10;
	a=t+a;
}

  1. 输出

实现一切之后,我们就可以输出。注意:此时存在字符串里的是答案数字,但由于ASCII码的影响,直接输出会答案错误,因此我们需要将其转换为字符形式才能够正确显示。

for(int i=0;i<a.size();i++)
	cout<<char(a[i]+'0');

三、高精度减法

高精度减法和高精度加法的原理一样,都是利用“竖式运算”的原理进行处理。

  1. 判断两个谁谁大谁小

如果大数减小数,得到的是正数;如果小的数减大数,相当于调换位置相减,但结果为负。

string a,b;
int f=0;  // f为0表示是大数减小数,结果为正

cin>>a>>b;

if(a.size()<b.size()||a.size()==b.size()&&a<b)
{
	swap(a,b);
	f=1;
}   //将较小的数放到字符串b,但此时要注意swap函数改变了原本被除数与除数的关系,原本是小数减大数答案是负数,现在则变成了大数减小数,所以我们需要新建一个变量来做标记答案是一个负数。如果此时两个字符串的长度一致,则可以比较它们的长度来判断将较小的数放到字符串b

  1. 高位补 0
int aa=a.size(),bb=b.size();

for(int i=1;i<=a.size()-b.size();i++)
{
	b='0'+b;  //高位补0
}

  1. 竖式计算,对齐相减
for(int i=a.size()-1;i>=0;i--)
{
	a[i]=(a[i]-’0’)-(b[i]-’0’);  //相减,将答案数字存进字符串a中
}

  1. 处理借位问题
for(int i=a.size()-1;i>=0;i--)
{
	if(a[i]<0)
	{
		a[i-1]-=1;  //如果是负数,说明不够减,需要向前一位借1
		a[i]=a[i]+10;
	}
}

  1. 删除前导0
int t=0; //但减法还需要有一个额外的判断就是前导0是不需要输出的

if(f==1) cout<<”-”; //f为1说明之前是小数减大数,所以要先输出“-”号

for(int i=0;i<a.size();i++)
{
	if(a[i]==0)
	{
		if(t==1) cout<<char(a[i]+'0');  //t==1时说明这不是前导0
	}
	else
	{
		cout<<char(a[i]+'0');
		t=1;  //前导0全部输出完,t标记为1
	}
}
C++: 高精度加法高精度减法 C++: 高精度加法高精度减法标签:C++ 高精度加法 高精度减法by 小威威在学C语言的时候,我有实现过高精度乘法(想了解的戳它)。 其实高精度加法减法比乘法简单多了,所以可以通过高精度乘法这篇文章来入门高精度算法。现在是用C++实现,显然有了string类,一切的操作都变的简单多了。题目如下:(Author: 欧文杰(TA)) This is an easy big integer. 阅读详情

相关推荐

C语言--实现高精度加法,减法,乘法,除法

大家都知道在C语言中:int 占4个字节,范围在,为数量级;long long 占8个字节,范围在,为数量级;数据量再往上,就需要用到高精度算法了,我们可以将数据存到没有上限的数组中,通过模拟计算来完成输出计算结果,接下来给大家介绍四种高精度算法;

weixin_74882234的博客 1995

#A. C08.L01.高精度加法减法.概述

想想我们列竖式计算加法时的思想是怎样的:将两个数字对应的个,十,百...位都对齐进行相对应的加法计算,满10就进1,不满则不进。从个位开始对齐,如果因为两个数字 的位数不同而导致其中一个数字的高位没有对应的数字对齐,那么我们就要在另一个数字对应的位置上进行空位补0。但我们要注意一个问题:我们通常的列竖式加法运算是从末尾开始逐次相加,对应到我们的字符数组中,我们就要得到两个字符数组中较长的作为边界条件,来写这个for循环。高精度减法高精度加法的原理一样,都是利用“竖式运算”的原理进行处理。

ch_yang123的博客 698

高精度运算】【高精度数字的存储以及输入输出】【高精度加法/减法/乘法】

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 C++内置的整数类型(如short,int,long long等),最大值都有一个限制,当我们在算法设计的过程中进行更大范围的数值计算中,应该如何.

不再痛苦的秘密,你找到了吗 2908

高精度计算

高精度计算是处理大数运算的重要方法,主要针对计算机常规数据类型无法满足的高位数运算需求。本文介绍了高精度计算的关键问题:数据存储方法、位数确定、进位借位处理等,并提供了加法减法、乘法、除法(高精除以低精和高精)的具体算法实现。每种运算都通过数组模拟竖式计算,详细说明了处理步骤和代码实现。最后还介绍了回文数问题在N进制下的求解方法,展示了高精度计算的实际应用。这些方法为解决大数据运算问题提供了有效途径。

weixin_68261272的博客 1093

c++】简单的高精度算法加法减法

在c语言中,我们的整型或浮点型最多只能做到18位内的四则运算,而高精度则是通过用字符型来模拟进行运算。所以高精度算法是指用于处理超出基本数据类型(如。等)表示范围的大整数或高精度小数的算法。这些算法通常通过自定义数据结构来存储和操作大数字,并实现相应的算术运算。

honghu100的博客 3146

高精度加法高精度乘法,高精度除法,高精度减法,链表相加

1. 高精度加减乘都是从后往前处理的,唯独高精度除法是从前往后处理的2. 高精度减乘除法需要处理前导0,高精度加法不需要从处理前导0,比如823 + 242 -> 328 + 242 = 5601 -> 10653. 高精度加法逆序数组,处理进位,逆序打印,高精度减法,处理负号,逆序存储,处理借位,处理前导零,是否加负号,逆序打印数组,高精度乘法,无进位相乘再相加,处理进位,处理前导零,逆序打印,高精度除法,每次处理商,处理余数,处理前导零4. 基本的做题步骤:1、将数组逆置。

的博客 1950

高精度加法减法

在C/C++中,我们经常会碰到限定数据范围的情况,我们先来看看常用的int和long long两种数据类型的范围吧。C++标准规定:int占一个机器字长。在32位系统中int占32位,即4个字节,所以int的范围是[-2的31次方,2的31次方-1],为1e8数量级;longlong的范围则是[-2的63次方,2的63次方-1],为1e18数量级。如果超过该数量级,该怎么办?此时就需要用到高精度算法

buaichifanqie的博客 1490

C++实现高精度加法高精度减法高精度乘法、高精度减法及思路注释

这里是一些废话: 早在学习斐波那契数列兔子繁殖问题的时候,超过一定输入值的运算结果值会发生溢出,当时带我的于老师就有提了一句我的程序该如何处理大数据运算的问题,多年之后(?!你还好意思说),我终于又有了一个机会来学习这种运算方式。 由于是自己学习,在查阅资料的过程中遇到了一些困难,我发现有一些代码根本没有注释或者给的思路提示很少让我看不懂,或者是只写了一个加减运算就弃坑了。自己就下决心学会了高精度四则运算之后一定要写一个非常详细的思路和注释给初学者,但是我学会了以后就并不想写思考历程了(??),好吧好吧

weixin_37706349的博客 4845

高精度计算:加法减法的艺术 —— 从原理到实现

高精度计算是处理超大整数的有效方法,通过将数字拆分成小块存储在数组或字符串中,模拟人工竖式计算。加法核心步骤包括逐位相加和处理进位,而减法需要处理借位和大小比较。文中提供了C++实现代码,采用倒序存储便于计算,并涵盖了正负数处理。高精度计算可拓展至乘法、除法等运算,实际开发中也可直接使用GMP等成熟库。该技术不仅实用,更能体现计算机科学中"分而治之"的核心思想。

2401_86509639的博客 1304

C++基础算法①——高精度减法计算

高精度导论、高精度+低精度、高精度+高精度高精度减法

博樽 1万+

高精度加法高精度减法

将这种大数字拆开,拆成一位一位的,这样可已输入位数很长的数,接下来将每一位取出,存入数组中 ,然后用一个数组去存储每个数字,最后再将数组进行相应的运算(加、减、乘、除、等)。上面判断len的目的,就是未来此处的使用,因为要逆序输出,要知道从len位开始,而因为上面对len进行了++操作(如果进位了的话),所以此处仍然可以用len-1。因为是减法,所以有可能减完后,某些位上可能会是0,如果这个位的前面没有1,则这个0是没有意义的,所以要将其删除。//定义两个字符串变量s1,s2,用于输入要相加的两个数字。

Swears_的博客 747

高精度加法 高精度减法 高度除法 高精度乘法 方法总结

高精度 模拟高精度 高精度加法 高精度减法 高度除法 高精度乘法 方法总结 高精度加减乘除

m0_73064964的博客 7604

C++高精度减法

为什么需要高精度计算 对于 C++ 而言,最大的数据为 long long(64b,8位),对于超过 8B 的数据,C++ 没有对应的数据类型进行表示。所以我们需要知道高精度计算。更详细的解释,可以参考这个网页https://blog.csdn.net/justidle/article/details/104414459。 高精度减法计算原理 在读小学时,我们做减法都采用竖式方法,如图 1 ...

努力中的老周的专栏 1万+

高精度的运算(加法减法、乘法)(java

文章目录1.高精度加法 实际上高精度就是说参运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算。 1.高精度加法 思路: 1、输入两个字符串,表示即将要进行加法运算的数,之所以是字符串,是因为有可能要输入的数字要很多位数字,从而超出了数据类型的范围。 2、定义一个数组来表示结果,其中这个数组的长度是两个字符串中的长度最大值max还要大1,比如888和222相加,那么得到的结果就是1110,结果长度为4,比两个字符串的长度的最大值3还要大1。 3、从右到左开始遍历字符串,从而首先将个

奋斗的龙猫的博客 2579

C++】详解高精度加法高精度减法高精度乘法、高精度除法代码

在进行大整数运算中,因为在C++/C中整数最大也就是unsigned long long也就才(1e19+8e18)位,如果要几百位的相加减就不行了,所以就要用高精度了,这里只在C++/C上使用有价值,在例如python、Java语言上无需写此算法,python可以无限大,Java里有相关库可以引入。

AiryCloud的博客 4646

C++算法高精度计算(加减法

C++中,高精度计算是一项重要的技能,特别是当处理的数据超出了标准数据类型(如int、long long等)的范围时。高精度计算通常涉及到大整数的加、减、乘、除等运算,这些运算在标准C++库中并不直接支持,因此需要手动实现或使用特定的库。以下是一些关于高精度计算的学习笔记,重点介绍高精度加法减法的实现。C++中的高精度算法主要通过模拟手工计算过程来实现,涉及字符串或数组的操作。尽管这种方法相对复杂且效率不如内置类型,但它能够处理任意大小的数值,是处理大数问题的有效手段。

shishuaiq的博客 2298

Spring 源码系列(23): SpringApplication.run() 启动全流程

本文深入解析了SpringApplication.run()的核心流程,通过源码拆解揭示了从启动到容器就绪的完整生命周期。文章重点分析了三个关键阶段:prepareEnvironment的配置加载逻辑(系统属性>环境变量>配置文件)、createApplicationContext的容器类型推断机制(基于classpath判断Web/Reactive/普通应用),以及callRunners的启动后回调特性(按@Order执行初始化任务)。同时澄清了常见误区,如内嵌Tomcat实际在refresh阶段的onR

不才不才不不才的博客 417
上一篇: STL之队列.概述
下一篇: 拓扑学原理
学渣小羊
博客等级 码龄2年 577粉丝 71原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值