题目描述
求两个大的正整数相减的差。
输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。
减法逻辑
代码
#include<iostream>
using namespace std;
int main(){
int a[201]={0},b[201]={0},c[201]={0},aLen,bLen,maxLen;
string as, bs;
//输入两个大整数
cin>>as>>bs;
//获取大整数的长度
aLen=as.length();
bLen=bs.length();
//大整数逆序存入a[]、b[]
for(int i=0;i<aLen;i++){
a[i]=as[aLen-i-1]-'0';
}
for(int i=0;i<bLen;i++){
b[i]=bs[bLen-i-1]-'0';
}
//去除大整数的前导0
while(a[aLen-1]==0 && aLen>1){
aLen--;
}
while(b[bLen-1]==0 && bLen>1){
bLen--;
}
maxLen=max(aLen,bLen);
//若a<b,输出一个负号,并交换a[]和b[],确保a[]存放较大数
if(aLen<bLen){
cout<<'-';
swap(a,b);
swap(aLen,bLen);
}
if(aLen==bLen){
for(int i=aLen-1,j=bLen-1;i>=0;i--){
if(a[i]==b[i]){
continue;
}else if(a[i]>b[i]){
break;
}else{
cout<<'-';
swap(a,b);
swap(aLen,bLen);
break;
}
}
}
//计算a-b
for(int i=0;i<maxLen;i++){
if(a[i]<b[i]){
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
}
//去除结果中的前导0
while(c[maxLen-1]==0 && maxLen>1){
maxLen--;
}
//输出结果
for(int i=maxLen-1;i>=0;i--){
cout<<c[i];
}
cout<<endl;
return 0;
}
关键点分析
关键点1
判断两个数大小前,要先删掉两个数的前导0。
关键点2
遇到较小数a减去较大数b的情况。
解决方法:
先输出负号‘-’,再把两个数互换,后续就是正常的a-b操作了。
关键点3
注意减法运算的借位:
if(a[i]<b[i]){
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
测试数据
数据 | 输入1 | 输入2 | 输出 |
---|---|---|---|
1 | 123456789 | 9876543 | 113580246 |
2 | 1000 | 999 | 1 |
3 | 00100 | 099 | 1 |
4 | 1 | 2 | -1 |
5 | 1 | 1 | 0 |
6 | 9876543 | 123456789 | -113580246 |
7 | 999 | 1000 | -1 |
8 | 099 | 00100 | -1 |
9 | 000100 | 999 | -899 |