高精度减法

高精度减法

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

两个高精度整数的减法

高精度指的是数字的大小非常非常大,最多能有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…

uniapp chooseVideo和uploadFile 选择视频或照片上传抖快平台踩坑

先贴代码 uni.chooseVideo({sourceType: [album],fail:(err)>{console.log(TAG, "chooseVideo-failerr:", err)page.resetUploadFileField()if (err.errNo 10200 || chooseVideo:fail take video fail err.errMsg || chooseVideo:fail auth deny err.errMsg) …

排序-插入排序

基本介绍 插入排序属于内部排序算法&#xff0c;是对于排序的元素以插入的方式找寻该元素的适当位置&#xff0c;以达到排序的日的。 插入排序(Insertion Sorting)的基本思想 把n个待排序的元素看成为一个有序表和一个无序表&#xff0c;开始时有序表中只包含一个元素&#xff…

架构设计-如何安全地传输密码

java web 项目中经常会遇到登录或注册的场景,如果查看浏览器的 network 网络请求时,用户的密码以明文方式传输,会造成很多安全隐患,这就涉及到密码如何安全传输的问题。 数据加密的重要性不言而喻,通用的加密技术有 哈希散列、对称加密、非对称加密。 哈希散列 哈希散列是…

论徐州高防IP的作用有哪些?

高防IP是一个专门解决大流量攻击的安全防护产品&#xff0c;能够支持网站和非网站类业务的DDOS防护和CC防护&#xff0c;是保护企业网络安全的重要手段&#xff0c;大部分的企业网站会选择应用高防IP&#xff0c;来保障企业业务的稳定可用性。 接下来小万就来介绍一下高防IP的作…

如何有效限制IP多次重新访问网站

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;在如今的网络世界中&#xff0c;有时候我们需要限制某些IP地址多次重新访问网站&#xff0c;以保护网站的安全性和用户体验。这一期淼淼将介绍一些常见的方法&#xff0c;帮助你有效地限制IP多次重新访问…

FPGA Verilog模块化设计入门篇一

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

【npm】一款时间日期工具库,你可以使用它来实现精美日历或欢迎页

时间转换工具 author: Vincamailbox: 237690966qq.comUpdateTime: 2024/6/13 15:29:18 安装 npm install v_datejs引用 import v from "v_datejs";使用 html&#xff1a; <template><code>{{ v.tm() }}</code> </template>js&#xff…

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;最上层是一些客户…

Web前端大结局:揭秘四重境界、五大法则、六大技巧与七大未来趋势

Web前端大结局&#xff1a;揭秘四重境界、五大法则、六大技巧与七大未来趋势 在浩瀚无垠的互联网世界中&#xff0c;Web前端技术以其独特的魅力&#xff0c;吸引着无数开发者投身其中。今天&#xff0c;我们将一起揭开Web前端的大结局&#xff0c;深入探讨其四重境界、五大法则…

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

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

MFC四种方法编写多线程

本文以四个demo为例&#xff0c;对MFC的多线程进行学习。学习的过程中写了四个demo&#xff0c;将其做成笔记&#xff0c;发布在csdn上面。 mfc多线程demo1 volatile BOOL m_bRun; CEdit* edit; void ThreadFunc(){CTime time;CString strTime;m_bRun true;while(m_bRun){ti…

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

第八届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;我们先在手机…

.pth文件是可以打开的吗?和.py文件是一样的吗?

#1 .pth文件是可以打开的吗&#xff1f;和.py文件是一样的吗&#xff1f; .pth文件&#xff08;通常是由PyTorch保存的模型权重文件&#xff09;和.py文件是完全不同的类型&#xff1a; pth文件&#xff1a;是二进制文件&#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…