news 2026/2/5 5:58:54

【算法入门-运算】大整数减法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【算法入门-运算】大整数减法

sum.back()==0是一个布尔表达式,其含义需要拆解为两部分理解:sum.back()==0,核心是判断容器sum最后一个元素(sum.back(),返回容器最后一个元素的引用)是否等于 0

sum.pop_back();移除容器的最后一个元素(但不会返回该元素)

#include <bits/stdc++.h> using namespace std; bool sign(vector<int>a,vector<int>b){ //位数相等 if(a.size()==b.size()){ //123 123特判了 //123 145——>遍历 for(int i=a.size()-1;i>=0;i--){ if(a[i]==b[i])continue; return a[i]>b[i]; } } //123445 145长度大的肯定大 return a.size()>b.size(); } int main() { string A,B; cin>>A>>B; vector<int>a; vector<int>b; for(int i=A.size()-1;i>=0;i--) a.push_back(A[i]-'0'); for(int j=B.size()-1;j>=0;j--) b.push_back(B[j]-'0'); //符号判断 bool flag=false; //a没b大 if(!sign(a,b)){ swap(a,b); flag=true;//需要符号 } int t=0; vector<int>sum; for(int i=0;i<max(a.size(),b.size());i++){ int num=0; if(i<a.size())num+=a[i]; if(i<b.size())num-=b[i]; num-=t; if(num<0){ t=1; sum.push_back(num+10);}else{t=0; sum.push_back(num);} } //前置0解决 while(sum.size()>1&&sum.back()==0) sum.pop_back(); //特判 //123 123 if(sum.size()==1&&sum[0]==0){ cout<<0<<endl; return 0; } if(flag)cout<<"-"; for(int i=sum.size()-1;i>=0;i--)cout<<sum[i]; cout<<endl; }

一、整体流程

  1. 把字符串 A、B 转成 “逆序数字向量”例如 "123" → [3,2,1]这样方便从最低位开始加减。

  2. 判断 A 是否大于 B如果 A < B,需要交换 A、B,并记录结果要加负号。

  3. 执行大数减法按位计算 a [i] - b [i],处理借位。

  4. 去掉结果前面的 0(逆序后是后面的 0)。

  5. 输出结果如果之前交换过,要先输出负号


sign 函数:判断 a 是否大于等于 b

cpp

运行

bool sign(vector<int>a,vector<int>b){ if(a.size()==b.size()){ for(int i=a.size()-1;i>=0;i--){ if(a[i]==b[i])continue; return a[i]>b[i]; } } return a.size()>b.size(); }

作用:比较两个 “逆序存储的大整数”,判断 a 是否 >= b。

逻辑:

如果位数不同:位数多的数大。

如果位数相同:从最高位往最低位比较(因为存储是逆序,所以从 size-1 往 0 遍历)。遇到第一个不同的数字就返回比较结果。

例如:a = [3,2,1](代表 123)b = [5,4,1](代表 145)比较最高位:1 vs 1 → 相同下一位:2 vs 4 → 2 < 4 → 返回 false(a < b)


main 函数开始

cpp

运行

string A,B; cin>>A>>B; vector<int>a; vector<int>b;

读取输入字符串 A、B,并定义两个向量存放数字。


字符串转逆序数字向量

cpp

运行

for(int i=A.size()-1;i>=0;i--) a.push_back(A[i]-'0'); for(int j=B.size()-1;j>=0;j--) b.push_back(B[j]-'0');

例如:A = "1234"处理后 a = [4,3,2,1]

为什么逆序?因为大整数加减要从个位开始,而个位在字符串的最后,逆序后方便从 index 0 开始处理。


判断 A 是否小于 B如果 A < B,则交换 a、b,并标记结果需要加负号。

cpp

运行

bool flag=false; if(!sign(a,b)){ swap(a,b); flag=true; }

例如:A = "123", B = "456"sign (a,b) 为 false → 说明 a < b交换后 a = 456, b = 123flag = true → 最后输出要加负号。


核心:大整数减法(重点!)

cpp

运行

int t=0; vector<int>sum; for(int i=0;i<max(a.size(),b.size());i++){ int num=0; if(i<a.size())num+=a[i]; if(i<b.size())num-=b[i]; num-=t; if(num<0){ t=1; sum.push_back(num+10); }else{ t=0; sum.push_back(num); } }

变量解释:t = 借位(borrow)sum 存放结果的每一位(逆序)

算法步骤:

循环每一位(从最低位开始):

取出 a [i](如果有)

减去 b [i](如果有)

再减去上一轮的借位 t

如果 num < 0:说明需要借位

借 1(t=1)

当前位变成 num + 10

否则:

不借位

直接存入 num

例如:a = [6,5,4](456)b = [3,2,1](123)计算过程:6-3=3 → sum=35-2=3 → sum=34-1=3 → sum=3结果 sum = [3,3,3] → 333


去掉结果中多余的前置 0(逆序后是末尾的 0)

cpp

运行

while(sum.size()>1&&sum.back()==0) sum.pop_back();

例如:结果 sum = [0,0,3,3]逆序后是 3300但我们要输出 33所以要删除末尾的 0。


特判:如果结果是 0

cpp

运行

if(sum.size()==1&&sum[0]==0){ cout<<0<<endl; return 0; }

例如:A = "123", B = "123"sum 会变成 [0]直接输出 0。


输出结果

cpp

运行

if(flag)cout<<"-"; for(int i=sum.size()-1;i>=0;i--)cout<<sum[i];

如果之前交换过(说明 A < B),要先输出负号。

然后逆序输出 sum,得到最终结果。

(豆包)

算法小白记录学习过程

若有错请指出

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/3 22:42:34

戴森球计划燃料棒生产终极指南:如何从零建立高效能源供应链

戴森球计划燃料棒生产终极指南&#xff1a;如何从零建立高效能源供应链 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 在戴森球计划的星际探索中&#xff0c;燃料棒是维持…

作者头像 李华
网站建设 2026/2/2 11:28:39

36、Python命令行工具的高级用法与实践

Python命令行工具的高级用法与实践 1. 多参数选项的使用模式 默认情况下, optparse 中的选项只能接受一个参数,但我们可以将其设置为接受多个参数。以下示例实现了一个类似 ls 的功能,可同时显示两个目录的内容: #!/usr/bin/env python import optparse import osd…

作者头像 李华
网站建设 2026/2/4 16:50:43

神级在线工具箱,牛批了

今天给大家推荐6款办公利器在线网站。对于平时处理一些文档还是非常实用的&#xff0c;这些网站都是免费的。喜欢的话可以加入浏览器的书签。 PDF 派 无限次使用&#xff0c;永久免费 几十个强大的PDF在线工具&#xff0c;免费使用&#xff0c;没有注册入口&#xff0c;都是VI…

作者头像 李华
网站建设 2026/1/29 13:50:41

移动开发新宠:用Flutter 4.0快速构建跨平台应用

一、框架革新&#xff1a;Flutter 4.0的技术架构突破 2025年发布的Flutter 4.0在渲染引擎Dart 3.4的支持下&#xff0c;实现了渲染一致性的重大提升。其Skia图形引擎的优化使iOS/Android双平台组件渲染差异率从3.0版本的5.7%降至0.8%&#xff0c;这直接解决了测试工程师长期面…

作者头像 李华
网站建设 2026/2/4 16:44:20

程序员必备软技能:高效沟通、时间管理与晋升规划之道

为什么软技能对测试工程师至关重要在软件开发的生命周期中&#xff0c;测试工程师处于产品质量保障的关键位置。除了扎实的技术能力外&#xff0c;出色的软技能已成为区分优秀测试工程师与普通执行者的关键因素。测试工作本质上是一个需要频繁沟通、精准协调和持续学习的过程—…

作者头像 李华
网站建设 2026/2/3 8:25:51

Bananas Screen Sharing:解决远程协作痛点的终极方案

Bananas Screen Sharing&#xff1a;解决远程协作痛点的终极方案 【免费下载链接】bananas Bananas&#x1f34c;, Cross-Platform screen &#x1f5a5;️ sharing &#x1f4e1; made simple ⚡. 项目地址: https://gitcode.com/gh_mirrors/ba/bananas 还在为复杂的屏…

作者头像 李华