算法标签:高精度
题目描述:
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
难度: 简单
思路
模拟手动计算两个正整数的减法
if bi>ai ai+=10 ai-1-=1
32
21
a[1]
a[2]a[1]
b[2]b[1]
if a>b
then sub(a,b)
if a1>b1
ans1=a1-b1-t
else ans1=-(b1-a1) exm: 5-2=2,3-5=-(5-3)=-2
题目代码
#include<iostream>
#include<vector>
using namespace std;
bool cmp(vector<int>&a,vector<int>&b)//比较ab大小
{
if(a.size()!=b.size())return a.size()>b.size();//a位数长于b 则true
for(int i=a.size()-1;i>=0;i--)//if a[i]>b[i]则ture 表明高位>B ;排列形式如a[n-1]a[n-2]..a[0]
if(a[i]!=b[i])return a[i]>b[i];
return true;
}
vector<int> sub(vector<int>&a,vector<int>&b)//计算ab差
{
vector<int>c;//存储答案
for(int i=0,t=0;i<a.size();i++)
{
t=a[i]-t;//t=a[i]-上一位可能存在的借走的数
if(i<b.size())t-=b[i];//如果b还有数 -=b
c.push_back((t+10)%10);
//if a-b-t>=0->t=(a-b-t)%10 and
//if a-b-t<0,t=(a-b-t+10)%10
//but if a-b-t>0 then (t+10)%10=t
//所以我们可以直接写 (t+10)%10
if(t>=0)t=0;//如果t>0表示没向上一位借数
else t=1;//说明借数
}
while(c.size()>1&&c.back()==0)c.pop_back();
return c;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int>A,B;
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//逆序读入数字,形如a[n-1]a[n-2]..a[0]
for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
vector<int>c;//存储答案
if(cmp(A,B))c=sub(A,B);//如果a>b c=a-b
else c=sub(B,A),cout<<"-";//否则 c=-(b-a)
for(int i=c.size()-1;i>=0;i--)cout<<c[i];//输出答案
return 0;
}