0
点赞
收藏
分享

微信扫一扫

[模板题]高精度减法


算法标签:高精度

题目描述:

给定两个正整数,计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

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;
}


举报

相关推荐

0 条评论