洛谷【2142】高精度減法
阿新 • • 發佈:2018-09-29
set put 否則 max can 復雜 比較 uri gnu
題目傳送門:https://www.luogu.org/problemnew/show/P2142
高精度減法板子題,回憶一下小學列豎式打草稿的過程即可。
時間復雜度:\(O(len)\)
空間復雜度:\(O(len)\)
代碼如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=10005; char s[maxn]; struct Bignum { int num[maxn]; void make() { num[0]=strlen(s+1); for(int i=1;i<=num[0];i++) num[i]=s[num[0]-i+1]-'0'; } void print() { if(!num[0])puts("0"); for(int i=num[0];i;i--) printf("%d",num[i]); } bool operator<(const Bignum &a)const { if(num[0]!=a.num[0])return num[0]<a.num[0];//位數不同比位數 for(int i=num[0];i;i--) if(num[i]!=a.num[i])return num[i]<a.num[i];//否則從高位到低位比較 return 0; } Bignum operator-(const Bignum &a) { Bignum c;memset(c.num,0,sizeof(c.num)); c.num[0]=max(num[0],a.num[0]); for(int i=1;i<=c.num[0];i++) { if(num[i]<a.num[i])num[i+1]--,num[i]+=10;//借位 c.num[i]=num[i]-a.num[i];//減 } while(c.num[0]&&!c.num[c.num[0]])c.num[0]--;//因為可能減掉很多位,所以是while return c; } }a,b,c; int main() { scanf("%s",s+1);a.make();; scanf("%s",s+1);b.make(); if(a<b)printf("-"),swap(a,b);//因為可能會有a<b的情況,所以判一下就可以了 c=a-b;c.print();//就很舒服 return 0; }
洛谷【2142】高精度減法