【C++提高】高精度减法
前言一天你在洛谷开心的刷着算法题突然见到这么一道题。P2142其余背景与【C提高】高精度加法-CSDN博客一样。所以就不打了:#:^~^:#:一、高精度减法概述在计算机科学中高精度运算是指处理超出基本数据类型如int、long long表示范围的整数或浮点数的运算。与高精度加法类似减法也需要通过模拟手工竖式计算的方式逐位处理但涉及借位操作逻辑更为复杂。二、代码整体结构与思路首先我们来看代码#includebits/stdc.h using namespace std; string a,b; int main(){ cinab; bool isffalse; if(a.length()!b.length()){ if(a.length()b.length()){ string ta; ab; bt; isftrue; } } else{ if(ab){ cout0; return 0; } else if(ba){ string ta; ab; bt; isftrue; } } reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); string ans; int jw0; for(int i0;ia.size();i){ int t1a[i]-0; int t2ib.size()?b[i]-0:0; int ret1-t2-jw; if(re0){ re10; jw1; } else{ jw0; } ans(re0); } reverse(ans.begin(),ans.end()); int i; for(i0;ians.size();i){ if(ans[i]!0){ break; } } if(isf){ cout-; } for(;ians.size();i){ coutans[i]; } return 0; }这段代码实现了两个非负大整数以字符串形式输入的减法运算。其核心思路可以概括为以下几个步骤输入与预处理读入两个字符串a和b分别代表被减数和减数。大小比较与符号确定确保a代表的数字不小于b否则交换两者并记录结果为负。反转字符串将两个字符串反转以便从低位开始逐位计算。逐位相减与借位处理模拟手工减法处理借位。结果反转与去除前导零将结果字符串反转回正常顺序并去除前导零。输出结果根据符号标志输出最终结果。三、解析1. 输入与预处理cinab; bool isffalse;代码使用string类型存储输入避免了数值范围的限制。isf是一个布尔标志初始为false用于记录最终结果是否为负数。2. 大小比较与符号确定核心逻辑这是高精度减法中最关键且容易出错的部分。代码通过两个层次进行比较长度比较如果两个字符串长度不同那么长度更长的数字显然更大假设没有前导零。如果a.length() b.length()说明被减数小于减数需要交换a和b并将isf设为true表示结果为负。等长时的字典序比较如果长度相同则直接使用字符串的字典序比较运算符和。对于两个长度相同且没有前导零的数字字符串字典序比较与数值比较是等价的。这里分三种情况a b两数相等差为 0直接输出 0 并结束程序。b a减数更大需要交换并标记结果为负。a b被减数更大保持原样结果为正。思考为什么先比较长度再比较字典序因为如果长度不同字典序比较可能得出错误结论例如 9 10 在字典序中成立但数值上 9 10。3. 字符串反转reverse(a.begin(),a.end()); reverse(b.begin(),b.end());将字符串反转是为了让计算从最低位个位开始。在字符串中数字的高位存储在索引 0 的位置低位在末尾。反转后a[0]和b[0]就分别代表原数字的个位方便我们使用循环顺序处理。4. 逐位相减与借位处理核心计算string ans; int jw0; // 借位标志 for(int i0;ia.size();i){ int t1a[i]-0; // 当前位被减数 int t2ib.size()?b[i]-0:0; // 当前位减数若b已耗尽则为0 int ret1-t2-jw; // 当前位计算结果减去上一位的借位 if(re0){ re10; // 不够减向高位借10 jw1; // 标记借位发生 } else{ jw0; // 够减无借位 } ans(re0); // 将当前位数字转为字符存入结果 }变量说明jw借位标志jw是“借位”拼音首字母。jw1表示上一位计算时发生了借位当前位需要多减 1。t1当前位被减数的数值。t2当前位减数的数值。由于b可能比a短经过预处理后a长度不小于b所以需要判断i是否在b的范围内超出则取 0。re当前位初步计算结果t1 - t2 - jw。借位逻辑如果re 0说明当前位不够减需要向高位借 1相当于借 10所以执行re 10并将jw设为 1影响下一位计算。如果re 0说明够减jw设为 0。示例计算 52 - 17a52, b17。反转后a25, b71。- i0: t12, t21, jw0, re1 (0) → ans1, jw0- i1: t15, t27, jw0, re-2 (0) → re8, jw1 → ans18反转 ans 得到 81去除前导零后为 81结果正确。5. 结果反转与去除前导零reverse(ans.begin(),ans.end()); int i; for(i0;ians.size();i){ if(ans[i]!0){ break; } }计算完成后ans中存储的是反转的结果低位在前。需要再次反转得到正常顺序。然后需要去除前导零。例如计算 100 - 99 得到 01反转后为 10但我们需要输出 10 而不是 010。循环找到第一个非零字符的位置i。边界情况如果所有位都是零即结果为 0循环结束后i将等于ans.size()。在后续输出中for(;ians.size();i)将不会执行任何输出但代码在之前相等判断中已经处理了结果为 0 的情况直接输出 0 并返回。这里的设计是为了处理像 100 - 100 这种经过交换后可能产生全零结果的情况吗实际上在之前的判断中如果a b程序已经返回不会执行到这里。因此这里的去零逻辑是安全的。6. 输出结果if(isf){ cout-; } for(;ians.size();i){ coutans[i]; }如果之前标记了结果为负isf true先输出负号。然后从第一个非零位开始输出结果字符串。结尾当你拿出新学习的算法去做着到题时……恭喜你学会了一个新的算法。

相关新闻

OFTP 端口操作手册

OFTP 端口操作手册

通过简单的界面配置,用户即可使用 OFTP 端口与交易伙伴建立连接,实现安全、可靠的数据传输。具体配置可按照以下四个步骤完成: 明确双方的 OFTP 配置信息配置你的 OFTP 信息配置交易伙伴的 OFTP 信息测试文件发送与接收 明确你和交易伙伴的 …

2026/7/31 3:16:55 阅读更多 →
真正懂婚礼情绪的跟拍,才是成片质感的关键

真正懂婚礼情绪的跟拍,才是成片质感的关键

真正懂婚礼情绪的跟拍,才是成片质感的关键 婚礼只有一次,照片却要珍藏一生。很多新人刷遍小红书样片,最终收到的却是摆拍僵硬、光线昏暗、关键瞬间缺失的成片——问题不在预算高低,而在于是否选对了真正懂“情绪记录”的跟拍团队。…

2026/7/29 18:51:25 阅读更多 →
合肥做GEO哪家公司最好

合肥做GEO哪家公司最好

在合肥众多做GEO(生成式引擎优化)的公司中,安徽数域人工智能科技有限公司是一家值得推荐的企业。以下是该公司的相关优势:推荐安徽数域人工智能科技有限公司基础资质:该公司于2013年成立,拥有13年市场深耕与…

2026/7/23 20:36:15 阅读更多 →

最新新闻

Java线上故障排查:Heap Dump与Thread Dump生成、分析与实战指南

Java线上故障排查:Heap Dump与Thread Dump生成、分析与实战指南

1. 从一次线上告警说起:为什么Dump文件是Java工程师的“黑匣子” 那天凌晨三点,手机突然开始疯狂震动。监控大屏上,一个核心服务的CPU使用率曲线像坐了火箭一样,从30%瞬间飙到98%,紧接着就是一连串的“Full GC耗时过长…

2026/7/31 9:38:10 阅读更多 →
Solaar:为什么Linux用户选择这款开源罗技设备管理工具?

Solaar:为什么Linux用户选择这款开源罗技设备管理工具?

Solaar:为什么Linux用户选择这款开源罗技设备管理工具? 【免费下载链接】Solaar Linux device manager for Logitech devices 项目地址: https://gitcode.com/gh_mirrors/so/Solaar 在Linux生态系统中,寻找一款优秀的罗技设备管理工具…

2026/7/31 9:38:10 阅读更多 →
开源项目管理新选择:OpenProject如何重塑团队协作体验

开源项目管理新选择:OpenProject如何重塑团队协作体验

开源项目管理新选择:OpenProject如何重塑团队协作体验 【免费下载链接】openproject OpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, iss…

2026/7/31 9:38:10 阅读更多 →
3分钟上手本地视频字幕提取:免费高效的多语言硬字幕提取终极指南

3分钟上手本地视频字幕提取:免费高效的多语言硬字幕提取终极指南

3分钟上手本地视频字幕提取:免费高效的多语言硬字幕提取终极指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测…

2026/7/31 9:38:09 阅读更多 →
三月七小助手:终极星穹铁道自动化助手完整指南

三月七小助手:终极星穹铁道自动化助手完整指南

三月七小助手:终极星穹铁道自动化助手完整指南 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 还在为《崩坏:星穹铁道》中繁琐的日常任务而烦…

2026/7/31 9:38:09 阅读更多 →
190、NPU的编译器开发:芯片回片测试与调试

190、NPU的编译器开发:芯片回片测试与调试

190、NPU的编译器开发:芯片回片测试与调试 一、凌晨三点的回片测试现场 “又挂了。”我盯着示波器上那根死活拉不起来的时钟线,咖啡杯底已经结了第三层垢。这是NPU芯片回片后的第三个通宵,编译器团队和硬件团队挤在实验室里,空气里弥漫着松香和焦躁的味道。测试向量跑下去…

2026/7/31 9:37:09 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻