高精度减法

高精度减法

  • 两个高精度整数的减法
    • 题目
    • 思路实现
    • 代码实现
  • 两个任意符号的高精度加减法

两个高精度整数的减法

高精度指的是数字的大小非常非常大,最多能有10的5次方 的 位数。

本次计算的两个数均为 正数,如何求负数会在最后提到。

题目

给定两个正整数(不含前导 0 0 0),计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1 ≤ 整数长度 ≤ 1 0 5 1 \le 整数长度 \le 10^5 1整数长度105

输入样例:

32
11

输出样例:

21

思路实现

我们先来模拟一下人类是怎么实现减法的。

在这里插入图片描述
首先 先计算 5 - 6,由于不够减,那么就需要 向上借一位。

然后就变成了 15 - 6,等于9。
在这里插入图片描述
接着计算 7 - 9,由于上一位 借了一位,所以应该是 6 - 9。

由于又不够借,所以再向上借一位。

16 - 9 = 7
在这里插入图片描述
最后 就是 11 - 5,所以最终答案是 679。

其实高精度减法 的 思路 是跟我们的减法是一模一样的。

代码实现

接着来看代码。

跟高精度加法一样,由于没有一个数据类型能够存储这么大的数字,所以需要用到数组存储.

由于vector容器不用手动 记录数组当前有效数据的个数,所以我们采用 vector 容器(后面也会有数组的代码,相较于vector,数组的优点是 比vector 会在时间上 快很多,vector的优点是 代码简单)。

在这里插入图片描述
这个字符串类型 是用于 读入 很大的数字的,因为整数类型存不下。

在这里插入图片描述
用字符串读入,然后遍历字符串,将每一位数字,存到数组里,这里的数字是倒着存的,原因我们后面在说。

注意这里的字符串遍历的 每一位都是 字符,所以一定要减去 ‘0’(字符0)。

接着我们需要注意一个问题,虽然读入的都是正数,但是 相减的操作是有可能 产生负数的。

根据人类减法的习惯,如果是一个小数字减去一个大数字,那么我们在脑子当中 计算的过程是,先大数字减去小数字 然后再带上负号。

所以这个时候就需要判断 A这个数字大,还是B这个数字大。

在这里插入图片描述
如果 A 大于等于B ,那么则正常计算。
在这里插入图片描述

如果 B 比较大,那么则计算 B - A,然后打印的 时候 多打印个 符号 即可。注意这里等于的情况是不需要打印 符号的,要不然结果会是 - 0。


接着我们来实现 compare 方法和 sub 方法。

对于compare方法来说,需要判断 A 数组里面存的数字大还是 B数组里面存的数字大。
在这里插入图片描述
规定 返回true 的时候 是 A大于等于 B ,返回 false 的时候是 B 大于 A。

注意:这里 等于这种情况一定 是 true ,因为如果是false 的 话 就会出现 -0的情况。 0是不需要加负号的。

在这里插入图片描述
首先 先看他们的数组长度,如果不一样,那么长度长的 一定大。

接着就开始从最高位比较,由于数组是倒着存的,那么最高位在数组的末尾。

在这里插入图片描述
其中 由于 此时的 A 的长度一定等于 B 的长度,所以 for循环 i 的初始值是谁的长度都是一样的。

从最高位开始比,如果两个值 不一样,那么大的整个数字 就一定大。

如果for 循环走完了,那么就说明 两个数字相等了,根据之前我们说的 ,等于一定是返回 true 的,要不然 就会打印 -0 .
在这里插入图片描述
当然这段代码还可以进行小优化。

在这里插入图片描述
这里的等号可以去掉,因为一定不可能出现等于的情况。

在这里插入图片描述


接着我们来看 sub 函数

首先函数的外壳长这个样子

在这里插入图片描述
由于 在main函数里面的 操作,这里 A的大小一定 是比 B的大。

接着需要定义一个变量来存储 上一位的借位。

在这里插入图片描述
这个 t 的 含义是 上一位 欠了几,比如 如果 5- 9 ,那么就叫做 欠了-1。

在这里插入图片描述
让这个 t 加上 被减数,然后如果 B 此时的位数有数字的话,减去 B这个数字。

接下来,就需要将结果放到 另一个vector容器中,到这里我们还没定义,得补上。

此时有两种情况,第一种是 t < 0,此时 就需要借一位了,就需要插入 (t + 10),另一种是 t > 0,此时不需要借位,直接插入 t 就可以了。

其实这两种情况也可以弄成一种情况。

在这里插入图片描述
如果插入 (t + 10) % 10,此时这两种情况就会都满足。

接着 再根据 t 的值,给出 这一位 欠多少。

在这里插入图片描述
如果小于 0 则代表,借了个1。大于0 则代表没有借。

最终经过一次遍历,得到的便是 两数相减的结果。

只不过此时还没有结束,我们少考虑了一个东西。

比如 是下面两个数 相减

在这里插入图片描述
那么就会得到 0025,所以我们需要把前面的0都给消去。

在这里插入图片描述
需要满足两个条件才抹去 最高位,第一个是 剩下的位数必须大于1,可不敢答案本来是 0,然后给他抹去了。

第二个是 你的最高位为0。

由于在数组后端移除数字比较方便,所以也解释了为什么数字在数组当中是倒着存的,当然也有一个原因是因为,要跟我们的高进度加法保持一致,这样组合运算的时候会方便很多。

最后,返回 vector容器 C即可。
在这里插入图片描述

完整代码如下:

#include <iostream>
#include <vector>
using namespace std;bool compare(vector<int>& A, vector<int>& B)
{if (A.size() != B.size()) return A.size() > B.size();for (int i = A.size()-1; i >= 0; i--){if (A[i] != B[i]) return A[i] > B[i];}return true;
}vector<int> sub(vector<int>& A, vector<int>& B)
{vector<int> C;int t = 0;for (int i = 0; i < A.size(); i++){t += A[i];if (i < B.size()) t -= B[i];C.push_back((t + 10) % 10);if (t < 0) t = -1;else t = 0;}while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a, b;vector<int> A, B;cin >> a >> b;for (int i = a.size()-1; i >= 0; i--) A.push_back(a[i] - '0');for (int i = b.size()-1; i >= 0; i--) B.push_back(b[i] - '0');if (compare(A, B)){auto C = sub(A, B);for (int i = C.size()-1; i >= 0; i--) cout << C[i];}else{auto C = sub(B, A);cout << '-';for (int i = C.size()-1; i >= 0; i--) cout << C[i];}return 0;
}

数组代码如下:

#include <iostream>
using namespace std;const int N = 1e5+10;string a, b;
int A[N], B[N], C[N], asz, bsz, csz;bool compare(int a[], int b[])
{if (asz != bsz) return asz > bsz;for (int i = asz-1; i >= 0; i--){if (a[i] != b[i]) return a[i] > b[i];}return true;
}void sub(int a[], int b[])
{int t = 0;for (int i = 0; i < asz; i++){t += a[i];if (i < bsz) t -= b[i];C[csz++] = (t + 10) % 10;if (t < 0) t = -1;else t = 0;}while (csz > 1 && C[csz-1] == 0) csz--;
}int main()
{cin >> a >> b;for (int i = a.size()-1; i >= 0; i--) A[asz++] = a[i] - '0';for (int i = b.size()-1; i >= 0; i--) B[bsz++] = b[i] - '0';if (compare(A, B)){sub(A, B);for (int i = csz-1; i >= 0; i--) cout << C[i];}else{swap(asz, bsz);sub(B, A);cout << '-';for (int i = csz-1; i >= 0; i--) cout << C[i];}return 0;
}

易错点:注意 数组的代码 中 如果 结果是负数,那么就一定要交换 asz 和 bsz 的值。

两个任意符号的高精度加减法

接下来我们来分析一下,如果题目当中给的数字 有负数怎么办,其实很好解决。

对于所有的问题 我们都可以把他们分为两种情况。
在这里插入图片描述
一种 是A 的绝对值加上B 的绝对值,另一种是 A的绝对值减去 B 的绝对值.

比如 -5 - 10 就可以转化为 - (5 + 10);
-5 + 10 就可以转化为 10 - 5 …

所以只需知道每个数是正的还是负的就可以了,我们在读取数字的时候是用 字符串读取的,所以是不是负数,我们只需要判断第一个字母是不是负号就可以了。

最后再根据 两个数的正负和 进行加或减的操作分类 即可。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决浏览器缩放的时候,重新设置滚动条的位置,使页面滚动条固定悬浮在页面底部

项目场景&#xff1a; 浏览器调试页面兼容页面时&#xff0c;缩放页面宽度&#xff0c;整体超出时滚动条出现在页面最底部&#xff0c;不是悬浮在页面下面&#xff0c;只有滚动到最底部才出现&#xff0c;需要的是悬浮在页面底部&#xff0c;不是滚动到最下面才出现 解决方案…

java面试整合全套

什么是Java &#xff08;定义 优点&#xff09; java是一个平台&#xff0c;由jvm和Java应用编程接口构成的一门面向编程语言。 不仅吸收了C语言的各种优点&#xff0c;还摒弃了c语言里面的多继承,指针等概念&#xff0c;因此java的特征主要有功能强大和简单易用的特征。 jav…

FPGA Verilog模块化设计入门篇一

随着电子技术的快速发展&#xff0c;现场可编程门阵列&#xff08;FPGA&#xff09;已成为现代电子系统设计中不可或缺的一部分。FPGA的灵活性、可重构性和高性能使得它成为处理复杂算法、加速数据处理和实现特定功能的理想选择。然而&#xff0c;随着系统复杂性的增加&#xf…

go-zero整合Excelize并实现Excel导入导出

go-zero整合Excelize并实现Excel导入导出 本教程基于go-zero微服务入门教程&#xff0c;项目工程结构同上一个教程。 本教程主要实现go-zero框架整合Excelize&#xff0c;并暴露接口实现Excel模板下载、Excel导入、Excel导出。 go-zero微服务入门教程&#xff1a;https://blo…

Mysql学习(九)——存储引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 七、存储引擎7.1 MySQL体系结构7.2 存储引擎简介7.3 存储引擎特点7.4 存储引擎选择7.5 总结 七、存储引擎 7.1 MySQL体系结构 连接层&#xff1a;最上层是一些客户…

自然语言处理领域的重大挑战:解码器 Transformer 的局限性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

聚焦赛宁网安竞赛平台+赛事服务,引领网络安全竞赛新潮流

第八届XCTF总决赛将在2024年6月22日于中国成都震撼开启&#xff0c;本届总决赛分为个人Live Solo和团队KOH巅峰对决两个赛道&#xff0c;从个人和团队多角度全方位考察参赛人员的竞技水平。 巅峰对决 智慧的火花在此碰撞 个人Live Solo赛制 Live Solo赛分为晋级赛和Solo赛。…

贝壳APP渗透测试WP

前期配置 环境说明 使用PIXEL 4手机&#xff0c;为Android 12系统 APP名为贝壳找房&#xff0c;包名com.lianjia.beike&#xff0c;版本号3.01.10&#xff0c;截至2024/05/07为最新版&#xff0c;小米应用市场下载 绕过反Frida机制 可以参考往期推送&#xff0c;《绕过最新…

2分钟用手机开发一个ChatBot

前言&#xff1a; 在上一期&#xff0c;我们测评了CodeFlying&#xff0c;用它开发出了一个复杂推文管理系统&#xff0c;然后体验了一下它的热门应用&#xff1a;AI智能机器人。今天咱就继续用CodeFlying来开发一个属于我们自己的聊天机器人。 老规矩&#xff0c;我们先在手机…

【qt】平面CAD(计算机辅助设计 )项目 上

CAD 一.前言二.界面设计三.提升类四.接受槽函数五.实现图形action1.矩形2.椭圆3.圆形4.三角形5.梯形6.直线7.文本 六.总结 一.前言 用我们上节课刚刚学过的GraphicsView架构来绘制一个可以交互的CAD项目! 效果图: 二.界面设计 添加2个工具栏 需要蔬菜的dd我! 添加action: …

遗传算法求解车间调度问题(附python代码)

背景介绍 车间调度问题&#xff08;Job Shop Scheduling Problem, JSSP&#xff09;是一类经典的组合优化问题&#xff0c;它在制造业和生产管理中有着广泛的应用。JSSP 的目标是对车间中的一系列作业进行排程&#xff0c;以使得作业在不同机器上的加工顺序是最优的&#xff0…

万相台的功能是什么?如何使用万相台?

1.特点&#xff1a; 万相台是一个智能渠道&#xff0c;可控性弱&#xff0c;高转化&#xff0c;人群&关键词是黑盒&#xff1b; 2.场景多&#xff1a; 有拉新快、活动加速、上新快、货品加速、活动加速、多目标直投、全站推等&#xff1b; 3.扣费逻辑&#xff1a;cpc付…

Sm4【国密4加密解密】

当我们开发金融、国企、政府信息系统时&#xff0c;不仅要符合网络安全的等保二级、等保三级&#xff0c;还要求符合国密的安全要求&#xff0c;等保测评已经实行很久了&#xff0c;而国密测评近两年才刚开始。那什么是密码/国密&#xff1f;什么是密评&#xff1f;本文就关于密…

Linux:线程概念 线程控制

Linux&#xff1a;线程概念 & 线程控制 线程概念轻量级进程 LWP页表 线程控制POSIX 线程库 - ptherad线程创建pthread_createpthread_self 线程退出pthread_exitpthread_cancelpthread_joinpthread_detach 线程架构线程与地址空间线程与pthread动态库 线程的优缺点 线程概念…

机器学习与数据挖掘知识点总结(二)分类算法

目录 1、什么是数据挖掘 2、为什么要有数据挖掘 3、数据挖掘用在分类任务中的算法 朴素贝叶斯算法 svm支持向量机算法 PCA主成分分析算法 k-means算法 决策树 1、什么是数据挖掘 数据挖掘是从大量数据中发现隐藏在其中的模式、关系和规律的过程。它利用统计学、机器学…

14.shell awk数组

awk数组 awk数组awk数组示例Nginx日志分析 awk数组 1.什么是awk数组 数组其实也算是变量,传统的变量只能存储一个值,但数组可以存储多个值 2.awk数组应用场景 通常用来统计、比如:统计网站访问TOP10、网站url访问TOP10等等 3.awk数组统计技巧 1.在awk中,使用数组时,不仅可以…

Interview preparation--RabbitMQ

AMQP AMQP(Advanced Message Queueing protocol). 高级消息队列协议&#xff0c;是进程之间床底一步新消息的网络协议AMQP工作原理如下&#xff1a; 发布者&#xff08;Publisher&#xff09;发布消息&#xff08;Message&#xff09;经过交换机&#xff08;Exchange&#xff…

新视窗新一代物业管理系统 GetCertificateInfoByStudentId SQL注入漏洞复现

0x01 产品简介 新视窗物业管理系统属于专家型的物业管理软件,能够给物业公司内部管理提供全面的解决方案,具有房产管理、客户管理、租赁管理、仪表管理、财务收费、发票管理、合同管理、仓储管理、设施设备管理、客户服务管理、会员管理、人事管理、资产管理、日常办公、档案…

HTML+CSS 动态卡片

效果演示 实现了一个带有动态背景和图片放大效果的卡片展示。卡片的背景是由两种颜色交替组成的斜线条纹&#xff0c;同时背景会以一定速度循环滚动。当鼠标悬停在卡片上时&#xff0c;卡片的图片会放大&#xff0c;并且卡片的背景会变为彩色。 Code HTML <!DOCTYPE html&…

简单聊一下Oracle,MySQL,postgresql三种锁表的机制,行锁和表锁

MySQL&#xff1a; MySQL使用行级锁定和表级锁定。行级锁定允许多个会话同时写入表&#xff0c;适用于多用户、高并发和OLTP应用。表级锁定只允许一个会话一次更新表&#xff0c;适用于只读、主要读取或单用户应用。 比如mysql开启一个窗口执行 begin; update xc_county_a…