企业网站管理的含义及内容,如何做贷款网站,重庆建设注册执业中心网站,凡科网商城充值sum.back()0 是一个布尔表达式#xff0c;其含义需要拆解为两部分理解#xff1a;sum.back() 和 0#xff0c;核心是判断容器 sum 的最后一个元素#xff08;sum.back()#xff0c;返回容器最后一个元素的引用#xff09;是否等于 0。sum.pop_back();移除容器的最后一个元…sum.back()0是一个布尔表达式其含义需要拆解为两部分理解sum.back()和0核心是判断容器sum的最后一个元素sum.back()返回容器最后一个元素的引用是否等于 0。sum.pop_back();移除容器的最后一个元素但不会返回该元素#include bits/stdc.h using namespace std; bool sign(vectorinta,vectorintb){ //位数相等 if(a.size()b.size()){ //123 123特判了 //123 145——遍历 for(int ia.size()-1;i0;i--){ if(a[i]b[i])continue; return a[i]b[i]; } } //123445 145长度大的肯定大 return a.size()b.size(); } int main() { string A,B; cinAB; vectorinta; vectorintb; for(int iA.size()-1;i0;i--) a.push_back(A[i]-0); for(int jB.size()-1;j0;j--) b.push_back(B[j]-0); //符号判断 bool flagfalse; //a没b大 if(!sign(a,b)){ swap(a,b); flagtrue;//需要符号 } int t0; vectorintsum; for(int i0;imax(a.size(),b.size());i){ int num0; if(ia.size())numa[i]; if(ib.size())num-b[i]; num-t; if(num0){ t1; sum.push_back(num10);}else{t0; sum.push_back(num);} } //前置0解决 while(sum.size()1sum.back()0) sum.pop_back(); //特判 //123 123 if(sum.size()1sum[0]0){ cout0endl; return 0; } if(flag)cout-; for(int isum.size()-1;i0;i--)coutsum[i]; coutendl; }一、整体流程把字符串 A、B 转成 “逆序数字向量”例如 123 → [3,2,1]这样方便从最低位开始加减。判断 A 是否大于 B如果 A B需要交换 A、B并记录结果要加负号。执行大数减法按位计算 a [i] - b [i]处理借位。去掉结果前面的 0逆序后是后面的 0。输出结果如果之前交换过要先输出负号sign 函数判断 a 是否大于等于 bcpp运行bool sign(vectorinta,vectorintb){ if(a.size()b.size()){ for(int ia.size()-1;i0;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]代表 123b [5,4,1]代表 145比较最高位1 vs 1 → 相同下一位2 vs 4 → 2 4 → 返回 falsea bmain 函数开始cpp运行string A,B; cinAB; vectorinta; vectorintb;读取输入字符串 A、B并定义两个向量存放数字。字符串转逆序数字向量cpp运行for(int iA.size()-1;i0;i--) a.push_back(A[i]-0); for(int jB.size()-1;j0;j--) b.push_back(B[j]-0);例如A 1234处理后 a [4,3,2,1]为什么逆序因为大整数加减要从个位开始而个位在字符串的最后逆序后方便从 index 0 开始处理。判断 A 是否小于 B如果 A B则交换 a、b并标记结果需要加负号。cpp运行bool flagfalse; if(!sign(a,b)){ swap(a,b); flagtrue; }例如A 123, B 456sign (a,b) 为 false → 说明 a b交换后 a 456, b 123flag true → 最后输出要加负号。核心大整数减法重点cpp运行int t0; vectorintsum; for(int i0;imax(a.size(),b.size());i){ int num0; if(ia.size())numa[i]; if(ib.size())num-b[i]; num-t; if(num0){ t1; sum.push_back(num10); }else{ t0; sum.push_back(num); } }变量解释t 借位borrowsum 存放结果的每一位逆序算法步骤循环每一位从最低位开始取出 a [i]如果有减去 b [i]如果有再减去上一轮的借位 t如果 num 0说明需要借位借 1t1当前位变成 num 10否则不借位直接存入 num例如a [6,5,4]456b [3,2,1]123计算过程6-33 → sum35-23 → sum34-13 → sum3结果 sum [3,3,3] → 333去掉结果中多余的前置 0逆序后是末尾的 0cpp运行while(sum.size()1sum.back()0) sum.pop_back();例如结果 sum [0,0,3,3]逆序后是 3300但我们要输出 33所以要删除末尾的 0。特判如果结果是 0cpp运行if(sum.size()1sum[0]0){ cout0endl; return 0; }例如A 123, B 123sum 会变成 [0]直接输出 0。输出结果cpp运行if(flag)cout-; for(int isum.size()-1;i0;i--)coutsum[i];如果之前交换过说明 A B要先输出负号。然后逆序输出 sum得到最终结果。豆包算法小白记录学习过程若有错请指出