题目描述
给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤100000
输入样例
32
11
输出样例
21
注释版代码
#include<iostream>
#include<vector>
using namespace std;
//判断A>=B是否
bool cmp(vector<int> &A,vector<int> &B)
{
if(A.size()!=B.size())//如果A和B的长度不一致
return A.size()>B.size();//那么我们直接返回A的长度>B的长度即A大于B
for(int i=A.size()-1;i>=0;i--)//如果一致,那么我们从高位往后比较,只要相同位大小比较成功即可判断
{
if(A[i]!=B[i])//如果A某位数字和B的该位数字不一致
{
return A[i]>B[i];//返回A[i]>B[i],即A>B
}
}
return true;//如果都不满足以上条件说明两个数是相等的,也返回true
}
vector<int> sub(vector<int> &A,vector<int> &B)
//加&是因为:避免复制:传递大型vector时,复制整个vector是非常耗时和占用内存的,通过引用传递则避免了这一问题。
//提高效率:引用传递速度更快,因为它仅仅是传递了一个指向原始数据的指针,而不是复制整个数据结构。
{
vector<int> C;
int t=0;//t表示借位,如果相减是后面那位有借位,前面相减的时候我们就得把借位给它减下去
for(int i=0;i<A.size();i++)//因为我们已经确保A一定大于B,所以用A的长度更保险
{
int m=A[i]-t;//设m为减完之后的数字,所以相减时都要减去被借的
if(i<B.size()) m=m-B[i];//如果B还有长度,就把B减下去,如果没有B了,那就不用减了
C.push_back((m+10)%10);//最后把(m+10)%10放进C容器里准备输出,(m+10)%10是一个通用式,分解后如下:
//m>=0,说明相减不用借位,C.push_back(m)
//m<0,说明不够减的,需要借位,C.push_back(m+10)
if(m<0) t=1;//不够减的,就借1位
else t=0;//不然就不用借
}
while(C.size()>1&&C.back()==0)//如果长度>1,比如003,并且最后放进去的是0(保证长度其实是为了保证结果为0的存在)
{
C.pop_back();//我们就把这两个0都去掉,直到长度不大于1,并且前面没有0了
}
return C;
}
int main()
{
string a,b;
vector<int> A,B;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--)//按照小学数学减法规范,需要将高位写在前面
{
A.push_back(a[i]-'0');//装进vector<int>容器里面,方便进行比较位数,并且vector容器的长度可以控制
}
for(int i=b.size()-1;i>=0;i--)
{
B.push_back(b[i]-'0');
}
if(cmp(A,B))//cmp函数是验证是否A>=B,返回true和false
{
auto C=sub(A,B);//如果A>=B,则用A-B
for(int i=C.size()-1;i>=0;i--)
printf("%d",C[i]);
}
else
{
auto C=sub(B,A);//如果A(not)>=B,则用B-A,既然都是用大的减去小的,所以sub函数只需要考虑大的减去小的即可
printf("-");
for(int i=C.size()-1;i>=0;i--)
printf("%d",C[i]);
}
return 0;
}
标签:return,高精度,int,back,--,vector,减法,size
From: https://blog.csdn.net/r2931887650/article/details/142657543