时间限制:1s 空间限制:64000KB题目等级:黄金 Gold
题目描述
给出两个正整数A和B,计算A-B的值。保证A和B的位数不超过500位。
输入描述
读入两个用空格隔开的正整数
输出描述
输出A-B的值
样例输入
3 12
样例输出
-9
解题思路
1、用字符串形式输入a,b两个大数
2、判断a,b两串长度,即两个数的位数
3、若位数相同,则 ①从最高位开始按位比较,发现a<b就交换两数,使a为两数中较大数 ②从个位开始做减法运算 ③输出结果
若位数不同,则 ①直接比较两数位数,保证a为两数中较大数 ②从个位开始按位做减法,直到较小数b的最高位,把结果存放到新字符串c中 ③把a剩余的位存入c中 ④c的倒序输出即为相减结果
AC代码如下:
#include<iostream>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
if( a.length()==b.length() ){
//按位检测,确保a>b
for( int i=0;i<a.length();i++ ){
if( a[i]==b[i] ){
continue;
}
if( a[i]>b[i] ){
break;
}
if( a[i]<b[i] ){
swap(a,b);
cout<<"-";
break;
}
}
//按位做减法
for( int i=a.length()-1;i>=0;i-- ){
if( a[i]>=b[i] ){
a[i]=a[i]-b[i]+'0';
}
else{
a[i]=a[i]+10-b[i]+'0';
--a[i-1];
}
}
cout<<a<<endl;
}
else{//a,b位数不等
//调整使a>b
if( a.length()<b.length() ){
cout<<"-";
swap(a,b);
}
string c;
int lc=0,i,j;
for( i=a.length()-1,j=b.length()-1 ; j>=0 ; --i,--j ){
if( a[i]>=b[j] ){
c[lc++]=a[i]-b[j]+'0';
}
else{
c[lc++]=a[i]+10-b[j]+'0';
--a[i-1];
}
}
for( int p=i;p>=0;--p ){
c[lc++]=a[p];
}
//避免高位输入0(1234-567输出0667这样的情况)
int flag=0;
for( int q=lc-1;q>=0;q-- ){
if( c[q]==0 && flag==0 ){
continue;
}
else if( c[q]!=0 ){
flag=1;
cout<<c[q];
}
else if( c[q]==0 && flag==1 ){
cout<<c[q];
}
}
cout<<endl;
}
return 0;
}