传送门 https://www.luogu.org/problemnew/show/P2142
因为忘了带书回家, 所以因为这道题我卡了半小时所以写篇博客 "纪念" 下
高精度减法中, 如果被减数比减数小, 就要用减数减去被减数. 接下来的判断就是本题的核心. 直接用 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";
- }
来源: http://www.bubuko.com/infodetail-2974298.html