11:大整数减法
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
求两个大的正整数相减的差。
输入
- 共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。 输出
- 一行,即所求的差。 样例输入
-
9999999999999999999999999999999999999 9999999999999
样例输出
9999999999999999999999990000000000000
//noi_1982
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
using namespace std;
int c[205]={0},d[205]={0};
void initial(int a[]){
string s;
cin>>s;
a[0]=s.length();
for(int i=1;i<=a[0];i++){
a[i]=s[a[0]-i]-'0';
}
for(int i=a[0];i>=1;i--){
if(a[i]==0&&a[0]!=1) a[0]--;
else break;
}
}
void printa(int a[]){
if(a[0]==0) {
cout<<0;
return;
}
for(int i=1;i<=a[0];i++){
cout<<a[a[0]+1-i];
}
cout<<endl;
}
void plusa(int a[],int b[]){
if(b[0]>a[0]) a[0]=b[0];
for(int i=1;i<=a[0];i++){
a[i]=a[i]+b[i];
a[i+1]+=a[i]/10;
a[i]%=10;
}
if(a[a[0]+1]) a[0]++;
}
int compareab(int a[],int b[]){
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>=1;i--){
if(a[i]>b[i]) return 1;
else if(a[i]<b[i]) return -1;
}
return 0;
}
void minusa(int a[],int b[]){
int ok=compareab(a,b);
//cout<<ok<<endl;
if(ok==0) {
a[0]=0;
return;
}
if(ok==-1){
cout<<'-';
a[0]=b[0];
for(int i=1;i<=a[0];i++){
int temp;
temp=a[i];
a[i]=b[i];
b[i]=temp;
}
}
// printa(c);
// printa(d);
for(int i=1;i<=a[0];i++){
a[i]=a[i]-b[i];
if(a[i]<0){
a[i]+=10;
a[i+1]--;
}
}
if(a[a[0]]==0) a[0]--;
}
int main(){
initial(c);
initial(d);
minusa(c,d);
printa(c);
return 0;
}
要注意判断哪个数是被减数。