3115 高精度練習之減法
阿新 • • 發佈:2019-01-08
解法一
[解題思路]
把輸入的數字以字串的形式儲存,轉變為對字串的處理,注意對負數,沒有意義的0的處理。
[程式碼實現]
解法二#include<iostream> #include<string> using namespace std; int main() { string a,b; cin>>a>>b; if (a.size()<b.size()||(a.size()==b.size()&&a<b)) /* 保證a>b */ { swap(a,b); cout<<"-"; } for (int i=1;i<=b.size();i++) { a[a.size()-i]=a[a.size()-i]-b[b.size()-i]+'0'; /*從個位減起,每一位簡單相減*/ } for (int i=1;i<=a.size();i++) { if (a[a.size()-i]<'0') /*退位*/ { a[a.size()-i-1]-=1; a[a.size()-i]+=10; } } int book; for (book=0;book<a.size();book++) /*對沒有意義的0的處理*/ { if(a[book]!='0') break; } for (int i=book;i<a.size();i++) { if (a[i]>='0'&&a[i]<='9') cout<<a[i]; } return 0; }
[解題思路]
把輸入的數字a和b以字串的形式儲存,再把a和b的每一位數字逆序轉換為int形式存在動態申請的ia和ib陣列。比較a和b兩者的大小,保證a>b,再把ia和ib的每一位數字相減存在較大的陣列中。
[程式碼實現]
#include<iostream> #include<string> using namespace std; int main() { string a,b; cin>>a>>b; int a_size=a.size(), b_size=b.size(); int size=a_size>b_size?a_size:b_size; /* 注意a和b陣列申請的大小為size */ int *ia=new int[size]; int *ib=new int[size]; /* 初始化 */ for (int i=0;i<size;i++) ia[i]=ib[i]=0; /* 逆序儲存 */ for (int i=0;i<a_size;i++) ia[a_size-i-1]=a[i]-'0'; for (int i=0;i<b_size;i++) ib[b_size-i-1]=b[i]-'0'; /* 保證a>b */ if(a_size<b_size || a_size == b_size && a<b) { swap(ia,ib); cout<<"-"; } /* 因為逆序,所以i=0是從個位減起 */ for (int i=0;i<size;i++) { ia[i]=ia[i]-ib[i]; } /*退位*/ for (int i=0;i<size-1;i++) { if(ia[i]<0) { ia[i+1]-=1; ia[i]+=10; } } /*不列印無意義的0*/ int book=0; for (book=size-1;book>=0;book--) { if(ia[book]) break; } for (int i=book;i>=0;i--) { cout<<ia[i]; } return 0; }