AcWing 792. 高精度减法
原题链接
简单
//高精度减法 减法要借位
#include<iostream>
#include<vector> // 包含动态数组的 vector 库
//vector来表示大整数,
using namespace std;
//判断是否有A>=B
bool cmp(vector<int> &A,vector<int> &B){
//先判断俩个数的位数
if(A.size()!=B.size()) return A.size()>B.size(); //A的位数大A就大
//位数一样时,从高位开始比较,高位相同再看下一位
/** 987
986 **/
for(int i=A.size()-1;i>=0;i--) //AB是存的时候高位在数组最后一位
if(A[i]!=B[i])
return A[i]>B[i];
//以上比较都相等时 则A和B就相等 返回true
return true;
}
//const int N=1e6 +10; // 定义常量整数 N,值为 1000000 加上 10
//C=A-B //vector<int> &A:用数组表示的大整数A
vector<int> sub(vector<int> &A,vector<int> &B){//加上&,会提高速率,不用拷贝
vector<int> C; // 初始化一个空向量 C,用于存储结果
int t=0; //存储进位
for(int i =0;i<A.size();i++){ // 循环遍历两个数字的每一位,A一定大于B的,A的size一定大于B的size
t=A[i]-t; //计算A的当前位与进位的差
//如果if里面的>=0 就是t本身 否则就返回t+10
if( i<B.size()) t-=B[i]; //如果B的当前位存在,则从结果中减去B的当前位
C.push_back((t+10)%10); //将结果取余数并存储在向量C中 如果t大于0 t+10在模10 就还是t 如果t<0 就是t+10
if(t<0) t=1; //如果差小于0,则需要借位,设置进位为1
else t=0; //否则,不需要借位,进位为0
}
while(C.size()>1 && C.back()==0) C.pop_back();
//C.size() > 1: 检查 C 的大小是否大于 1。这个条件确保至少有两个元素,因为我们不想在 C 仅包含一个元素时移除它。
//C.back() == 0: 检查 C 的最后一个元素是否为 0。
//C.pop_back(): 移除 C 的最后一个元素。
//去除结果向量C中的前导零(高位全是0)0002 要去掉0 变为2 C.back()表示C的最后一位
return C; // 返回相加结果向量 C
}
int main(){
string 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'); //A=[6,5,4,3,2,1]
// 将字符串 a 转换为整数向量 A
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
if(cmp(A,B)) //判断A和B的大小
{ //如果A>B,A>B直接算
auto C=sub(A,B); //auto:让编译器自己推断是哪个类型 相当于vector<int>
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
// 以 逆序 打印结果向量 C 中的每一位
}
else{
auto C=sub(B,A);
printf("-");
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
// 以 逆序 打印结果向量 C 中的每一位
}
return 0;
}