poj2453------An Easy Problem 进制转换 水题
#include<iostream>#include<cstdlib>#include<stdio.h>#include<memory.h>#include<math.h>using namespace std;int n,cc,num;int s1[32],s2[32];void zhuan(){ cc=0; int nn=n; num=0; while(nn) { s1[cc++]=nn&1; nn/=2; } int j=0; for(int i=cc-1;i>=0;i--) { s2[j++]=s1[i]; } /*for(int i=0;i<cc;i++) cout<<s2[i]; cout<<endl;*/}void solve(){ memset(s1,0,sizeof(s1)); int i; for(i=cc-1;i>=0;i--) { if(s2[i]==1) break; } if(i==0) { s1[0]=1; cc++; // puts("!"); } else { if(s2[i-1]==0) { for(int j=0;j<i-1;j++) s1[j]=s2[j]; s1[i-1]=1;s1[i]=0; for(int j=i+1;j<cc;j++) s1[j]=s2[j]; //puts("@"); } else { int q=-1; while(s2[i]==1) { q++; i--; if(i<0) break; } if(i<0) { s1[0]=1;cc++; for(int j=cc-1;j>cc-1-q;j--) s1[j]=1; //puts("&"); } else { for(int j=0;j<i;j++) s1[j]=s2[j]; s1[i]=1; for(int j=cc-1;j>cc-1-q;j--) s1[j]=1; //puts("^"); } } }}void solve2(){ int res=0; for(int i=0;i<cc;i++) { res+=s1[i]*pow(2,cc-1-i+0.0); } printf("%d\n",res);}int main(){ while(scanf("%d",&n)&&n) { if(n==1) {puts("2");continue;} zhuan(); solve(); /*for(int i=0;i<cc;i++) cout<<s1[i]; cout<<endl;*/ solve2(); }}