1. 程式人生 > >P2412高精度減法

P2412高精度減法

else 一點 text lena sca 接下來 rcm main 小時

傳送門

因為忘了帶書回家,所以因為這道題我卡了半小時所以寫篇博客“紀念”下

高精度減法中,如果被減數比減數小,就要用減數減去被減數。接下來的判斷就是本題的核心。直接用strcmp是不行的,例如100與99,用strcmp就是99大,所以我們還要再看長度。這裏要特別註意一點,下面的代碼是不行的。

if(strcmp(s,k)>=0||lena>lenb)

所以判斷這裏我們就要分類討論兩次(第一次比較長度,第二次用strcmp)

代碼如下(原諒蒟蒻的一匹的我代碼長) 

#include<iostream>
#include<cstdio>
#include
<cstring> using namespace std; char s[10001],k[10001]; int a[10000001],b[100001],c[10000001]; void j(int,int,int); void jf(int lena,int lenb,int lenc) {if(lena>lenb) { while(lenc<=lena||lenc<=lenb) { if(a[lenc]<b[lenc]) {a[lenc+1]--;a[lenc]+=10;} c[lenc]=a[lenc]-b[lenc]; lenc
++; }while(c[lenc]==0)lenc--; for(int i=lenc;i>=1;i--) cout<<c[i]; } if(lena==lenb) {if(strcmp(s,k)>=0) {while(lenc<=lena||lenc<=lenb) { if(a[lenc]<b[lenc]) {a[lenc+1]--;a[lenc]+=10;} c[lenc]=a[lenc]-b[lenc]; lenc++; }while
(c[lenc]==0)lenc--; for(int i=lenc;i>=1;i--) cout<<c[i]; } else j(lena,lenb,lenc); } if(lena<lenb) j( lena, lenb, lenc); } void j(int lena,int lenb,int lenc) {while(lenc<=lena||lenc<=lenb) { if(b[lenc]<a[lenc]) {b[lenc+1]--;b[lenc]+=10;} c[lenc]=b[lenc]-a[lenc]; lenc++; }while(c[lenc]==0)lenc--; cout<<"-"; for(int i=lenc;i>=1;i--) cout<<c[i]; } int main() {int lena,lenb,lenc,t=0; scanf("%s",s);t++; scanf("%s",k);t++; lena=strlen(s); lenb=strlen(k); for(int i=0;i<=lena-1;i++) {a[lena-i]=s[i]-48; } for(int i=0;i<=lenb-1;i++) b[lenb-i]=k[i]-48; lenc=1; if(strcmp(s,k)!=0)jf(lena,lenb,lenc); else cout<<"0"; }

P2412高精度減法