这题模拟比较麻烦,所以贴了上来,代码没有优化。 #include<iostream> #include<math.h> using namespace std; const int Size=15; char ch[Size]; int n[Size]; int cnt[Size]; int num[11]={0,3,12,48,192,768,3072,12288,49152,196608,786432}; int l; void init(){ int i; for(i=0;i<l;i++){ n[i]=ch[i]-'0'; } } bool check(){ int i; for(i=0;i<l-1;i++){ if(n[i]>3) return false; } if(n[l-1]>2) return false; return true; } bool ok(int &i){ for(;i<l-1;i++){ if(n[i]>3) return true; if(n[i]<3) return false; } if(n[l-1]<2) return false; return true; } int doit(){ int i,sum=0,sum1=1; if(l>1){ int index=0; if(ok(index)){ return num[l]; } else { int nn[Size],ll=l; for(i=1;i<l;i++){ if(n[i]!=0) break; } int k=i; if(l>k){ for(i=0;i<l;i++) nn[i]=n[i]; for(i=k;i<l;i++) n[i-k]=n[i]; l=l-k; sum=doit(); l=ll; for(i=0;i<l;i++) n[i]=nn[i]; } else sum+=1; } int t=l-1; int tt=n[0]>3?3:n[0]; if(l>2) sum+=(tt-1)*pow(4.0,l-1-1)*3; else sum+=(tt-1)*3; } if(l>=2){ sum+=num[l-1]; } else sum=n[0]<3?(n[0]+1):3; return sum; } int main(){ while(scanf("%s",&ch)!=-1){ l=strlen(ch); init(); int ans=doit(); if(check()) ans--; printf("%d/n",ans); } return 0; }