C++高精度減法
阿新 • • 發佈:2020-12-15
- 超長正整數的減法
【問題描述】
編寫程式實現兩個超長正整數(每個最長80位數字)的減法運算。
【輸入形式】
從鍵盤讀入兩個整數,要考慮輸入高位可能為0的情況(如00083)。
- 第一行是超長正整數A;
- 第二行是超長正整數B;
【輸出形式】
輸出只有一行,是長整數A減去長整數B的運算結果,從高到低依次輸出各位數字。要求:若結果為0,則只輸出一個0;否則輸出的結果的最高位不能為0,並且各位數字緊密輸出。
【輸入樣例】
234098
134098703578230056
【輸出樣例】
-134098703577995958
【樣例說明】
進行兩個正整數減法運算, 234098 -134098703578230056 = -134098703577995958。
【評分標準】
完全正確得20分,每個測試點4分。
我就差個高精度除法沒寫過了
#include<bits/stdc++.h>
using namespace std;
char a1[100000],b1[100000];
int a[100000],b[100000],c[100000];
int i,j;
bool cmp(void){
if(a[0]!=b[0])return a[0]>b[0];
for(i=0;i<=a[0];i++){
if(a[a[0]-i]!=b[b[0]-i])return a[a[0]]>b[b[0]];
}
return true;
}
void sub(int a[],int b[] );
int main(void){
scanf("%s%s",a1,b1);
a[0]=(int)strlen(a1);
b[0]=(int)strlen(b1);
for(i=1;i<=a[0];i++)a[i]=a1[a[0]-i]-'0';
for(i=1;i<=b[0];i++)b[i]=b1[b[0]-i]-'0';
while(!a[a[0]])a[0]--;
while(!b[b[0]])b[0]--;
if(cmp())sub(a,b);
else {sub(b,a);printf("-");}
while(!c[c[0]]&& c[0]>1)c[0]--;
for(j=c[0];j>=1;j--)printf("%d",c[j]);
return 0;
}
void sub(int A[],int B[]){
for(i=1;i<=A[0];i++){
if(A[i]>=B[i])c[i]=A[i]-B[i];
else {
A[i+1]--;
c[i]=A[i]-B[i]+10;
}
}
c[0]=A[0];
}