当前位置: 首页 > news >正文

高精度减法模版和分析(C++版本)

1.高精度减法

下面的这个是来自于洛谷上面的题目:

image-20250716211958075

2.代码实现

下面的这个是具体的代码,我认为还是有点复杂的,简单的看一下吧:

#include <iostream>using namespace std;const int N = 1e6 + 10;int a[N], b[N], c[N];
int la, lb, lc;// 比大小
bool cmp(string& x, string& y)
{// 先比较长度if(x.size() != y.size()) return x.size() < y.size();// 再按照 字典序 的方式比较return x < y;
}// 高精度减法的模板 - c = a - b
void sub(int c[], int a[], int b[])
{for(int i = 0; i < lc; i++){c[i] += a[i] - b[i]; // 对应位相减,然后处理借位if(c[i] < 0){c[i + 1] -= 1; // 借位c[i] += 10;}}// 处理前导零while(lc > 1 && c[lc - 1] == 0) lc--;
}int main()
{string x, y; cin >> x >> y;// 比大小if(cmp(x, y)){swap(x, y);cout << '-';}// 1. 拆分每一位,然后逆序放在数组中la = x.size(); lb = y.size(); lc = max(la, lb);for(int i = 0; i < la; i++) a[la - i - 1] = x[i] - '0';for(int i = 0; i < lb; i++) b[lb - i - 1] = y[i] - '0';// 2. 模拟减法的过程sub(c, a, b); // c = a - b// 输出结果for(int i = lc - 1; i >= 0; i--) cout << c[i];return 0;
}

1)我觉得在这个问题里面可以抓住两条主线:相较于我们的这个高精度的加法的主线;

第一点:变化的是什么,没有变化的是什么;

第二点:我们的这个减法里面的主要模块的划分;

2)先来谈谈这个第一点的主线,变化的是什么,这个里面多了cmp函数,因为需要保证这个事大数减去小数,不变的就是我们的这个思路是不变的,还是字符串转换成为数组倒序的存放到我们的这个对应的数组里面去,然后进行这个位数的处理过程;

3)首先看一下这个第一大模块,就是这个sub方法,或者叫做函数,这个里面的swap实际上就是想要保证这个事大数据减去小数据,仅此而已,这个需要先去判断这个位数,位数不一样的话,直接根据这个位数多的确定大小即可;

位数一样的时候,按照这个字典序进行比较即可,如果需要进行交换,说明这个本来说是小数减去大数,因此这个cmp判断里面有这个cout负号的过程,这个就是为了保证我们的这个绝对值不变,但是这个负号需要改变,这个是数学知识,我不想多去赘述;

4)sub函数是这个代码里面的核心和我们的这个加法里面的add函数类似,注意这个里面的+=,这个和我们的高精度加法里面的这个事类似的,然后这个if事在判断我们的这个借位情况,比如这个类似于2-8之类的情况,我们需要进行借位,但是这个需要判断,只有两个数据相减出现负数的时候才说明这个需要借位;

5)借位的时候就是前面的这个c[i+1]减去1即可,不要问我这个为什么是i+1,因为这个顺序和我们的这个字符串里面的这个顺序是相反的,大家自己去理解一下,我点到为止;

6)然后就是这个0的处理,我们的加法运算里面是这个高位的进位处理;

减法里面是0的处理。例如我们的997-995,这个时候计算之后就是002,但是这个高位的0显然是不需要进行输出的,因此这个需要保证我们的这个指针lc指向的是我们的这个结果里面的第一个非零的数据,也就是我们的这个while里面的c[lc-1]的判断条件;

但是还有一个情况,例如我们的999-999,这个时候就是000,这个时候我们是需要输出结果的,因此这个事需要保留一个0的,也就是我们的这个while条件里面的这个lc>1的情况,只有当这两个条件同时满足的时候,这个代码才会执行;

http://www.dtcms.com/a/286265.html

相关文章:

  • 嵌入式八股(持续更新)
  • 【算法训练营Day14】二叉树part4
  • windows终端美化(原生配置+Oh My Posh主题美化)
  • 客诉:危机到信任的重建
  • Flutter 应用如何设计通知服务
  • Flutter——Android原生View是如何通过Flutter进行加载
  • 2025年Flutter开发主流技术栈
  • Flutter 多语言(国际化)入门教程
  • 企业如何让内部视频仅限公司官网或指定域名播放?
  • 低代码开发实践博客
  • C++语法 匿名对象 与 命名对象 的详细区分
  • IDEA 中 Maven 配置:当前项目与新项目的统一设置方法
  • 【Docker基础】Docker Compose核心配置文件深度解析:从YAML语法到高级配置
  • 【数据结构】栈的深入解析--用C语言实现
  • Linux 环境下 NNG 通讯库:在嵌入式设备上应用
  • [2025CVPR-目标检测方向] CorrBEV:多视图3D物体检测
  • Docker 与 GPU 训练
  • 排序【各种题型+对应LeetCode习题练习】
  • 线程控制:互斥与同步
  • IDEA高效开发:Database Navigator插件安装与核心使用指南
  • Python趣味算法:抓交通肇事犯(车牌号谜题解析)
  • nginx定制http头信息
  • 腾讯云云服务器深度介绍
  • 面试150 克隆图
  • 通缩期的 “反脆弱” 研发:新启航逆势投入 30% 营收突破 3D 白光干涉测量技术
  • 深孔加工的方法及检测方法探究 —— 激光频率梳 3D 轮廓检测
  • 29、鸿蒙Harmony Next开发:深浅色适配和应用主题换肤
  • 计算机网络基础:从协议到通信全解析(大致框架)
  • 基于 WinForm 与虹软实现人脸识别功能:从理论到实践
  • VisualXML全新升级 | 新增BusLoad计算