https://www.acwing.com/problem/content/794/
#include<bits/stdc++.h> using namespace std; //判断是否有a>=b 如果是 返回true 反之 返回false bool cmp(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; //如果都相等 那么a b相等 直接返回 } // C=A-B vector<int> sub(vector<int> &A, vector<int> &B) { //因为在下面判断过 所以A的位数大于B的位数 vector<int> C; for(int i=0,t=0; i<A.size(); i++) { //t表示是否有借位 t=A[i]-t; //当前位 if(i<B.size()) t-=B[i]; //判断B有没有这一位。如果有,才会减去。如果没有 就是0 就不用减去 C.push_back((t+10)%10); //如果此时t大于等于0,那么就是t本身。如果小于0,那么就返回t+10 两种情况综合,就是(t+10)%10 if(t<0) t=1; //如果t小于零,表示有借位 else t=0; } //去前导0 如果只有一位,而且位0,那么就不用去掉 while(C.size()>1&&C.back()==0) C.pop_back(); return C; } int main() { string a,b; //如果有负数 那么就在a和b开头判断是否为-,如果为-,需要打一个标记,存一下每个数是否为负号 //两个数字相减 A-B ,如果说,有可能是正负的话 那么一定可以转换为他们的绝对值相减或者绝对值相加的情况 |A|-|B| |A|+|B| //总之 需要分情况讨论 vector<int>A,B; cin>>a>>b;//a=123456 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(cmp(A,B)) { //先判断谁大 auto C=sub(A,B); //如果a大 直接算 输出 for(int i=C.size()-1; i>=0; i--) cout<<C[i]; } else { //如果b大 auto C=sub(B,A); //颠倒一下 cout<<"-"; //输出负号 for(int i=C.size()-1; i>=0; i--) cout<<C[i]; } return 0; }