蓝桥杯试题集试题总汇(C++)
问题描述
高精度减法
输入格式
两行,表示两个非负整数a、b,且有a > b。
输出格式
一行,表示a与b的差
样例输入
1234567890987654321
9999
样例输出
1234567890987644322
分析
由于输入数据超过整形所表示范围,所以从字符串存入输入数据。将差值用数组存储,注意数组的声明最好大一点,以防测试样例数据较大,使数组溢出。
参考代码
#include<iostream>
using namespace std;
int main()
{
string a,b;
int c[505],t=0;//c数组用来储存差
int r=0;//表示借位
cin>>a>>b;
int la=a.size()-1;
int lb=b.size()-1;
while(la>=0||lb>=0)//一位一位的减,从个位开始
{
if(la>=0&&lb>=0)//两个差数都有
{
r=r+(a[la]-'0')-(b[lb]-'0');
}
if(la>=0&&lb<0)//如果缺b,则直接输出a和进位,由于已经说明a>b,所以不用考虑缺a的情况
{
r=r+(a[la]-'0');
}
if(r<0)//如果r<0则需要向高位借位
{
c[t++]=r+10;
r=-1;//r=-1表示向高位借一位
}
else
{
c[t++]=r;
r=0;
}
la--;//进行下一位
lb--;//进行下一位
}
//如果最高位有进位,那么把这个进位也输出,比如99+1,没有此处理是00
for(int i=t-1;i>=0;i--)//倒着输出
{
if(i==t-1&&c[i]==0)//考虑a最高位为1且被借位,比如10-2=8,而c数组存储的是08,不需要输出0
continue;
else
cout<<c[i];
}
return 0;
}