高精度按题意递归模拟。
考虑更优雅的实现,由于我们需要读入十进制在提取二进制,我们可以考虑将数字用多个 Int 来分段存储。
同时注意到数字只有不到 $600$ 个二进制位,所以第二层递归的时候就可以直接用 Int 了。
更具体的,我们并不需要将第一层也写进递归函数中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include<bits/stdc++.h> using namespace std; const int maxn=200; const int maxm=35; const int maxk=20; const int maxs=10; char s[maxn+5]; int a[maxm+5]; void Print(int x){ bool flg=0; for(int i=maxs-1;i>=0;i--){ if((x>>i)&1){ if(flg) printf("+"); flg=1; if(i==0) printf("2(0)"); else if(i==1) printf("2"); else{ printf("2("); Print(i); printf(")"); } } } } signed main(){ freopen("power.in","r",stdin); freopen("power.out","w",stdout); scanf("%s",s); int len=strlen(s); for(int i=0;i<len;i++){ for(int j=0;j<maxm;j++) a[j]*=10; a[0]+=s[i]-'0'; for(int j=0;j<maxm;j++) a[j+1]+=a[j]>>maxk,a[j]&=(1<<maxk)-1; } bool flg=0; for(int i=maxm-1;i>=0;i--){ for(int j=maxk-1;j>=0;j--){ if((a[i]>>j)&1){ if(flg) printf("+"); flg=1; if(i*maxk+j==0) printf("2(0)"); else if(i*maxk+j==1) printf("2"); else{ printf("2("); Print(i*maxk+j); printf(")"); } } } } return 0; }
|