P2412高精度减法
因为忘了带书回家,所以因为这道题我卡了半小时所以写篇博客“纪念”下
高精度减法中,如果被减数比减数小,就要用减数减去被减数。接下来的判断就是本题的核心。直接用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"; }