POJ2116 Death to Binary?

  1 /*
  2  POJ2116 Death to Binary?
  3  http://poj.org/problem?id=2116
  4  齐肯多夫定理
  5 
  6  */
  7 #include <cstdio>
  8 #include <algorithm>
  9 #include <cstring>
 10 #include <cmath>
 11 #include <vector>
 12 #include <queue>
 13 #include <iostream>
 14 #include <map>
 15 #include <set>
 16 //#define test
 17 using namespace std;
 18 const int Nmax=1e6+7;
 19 char s[50],a[50],b[50],c[50],tmp[50],t[50];
 20 long long f[50];
 21 vector<long long> v;
 22 vector<long long>::iterator it;
 23 long long scan()
 24 {
 25     char c=getchar();   
 26     while(c==' '||c=='\n')
 27         c=getchar();
 28     if(c==-1)
 29         return -1;
 30     int sz=0;
 31     while(c>='0' && c<='1')
 32     {
 33         s[++sz]=c;
 34         c=getchar();
 35     }
 36     long long x=0LL;
 37     for(int i=1;i<=sz;i++)
 38     {
 39         x+=1LL*(s[i]-'0')*f[sz-i];
 40     }
 41     return x;
 42 }
 43 int id(long long x)
 44 {
 45     int now=upper_bound(v.begin(),v.end(),x)-v.begin();
 46     if(now!=0)
 47         now--;
 48     return now;
 49 }
 50 char* get(long long x)
 51 {
 52    int sz=0;
 53    for(int i=0;i<=40;i++)
 54        tmp[i]='0';
 55    //printf("\n");
 56    while(x>0)
 57    {
 58        //printf("x:%lld\n",x);
 59        tmp[id(x)]='1';
 60        sz=max(sz,id(x));
 61        //printf("%d ",id(x));
 62        //printf("%lld",f[id(x)]);
 63        x-=f[id(x)];
 64    }
 65    //printf("\n");
 66    //for(int i=0;i<=40;i++)
 67        //printf("%c",tmp[i]);
 68    //printf("\n");
 69    
 70    //printf("%s\n",tmp);
 71  
 72    for(int i=sz;i>=0;i--)
 73        t[sz-i]=tmp[i];
 74    t[sz+1]='\0';
 75    return t;
 76 }
 77 void print()
 78 {
 79     int n=strlen(c);
 80     int sum=n+2;
 81     int an=strlen(a);
 82     int bn=strlen(b);
 83     for(int i=1;i<=sum-an;i++)
 84         putchar(' ');
 85     printf("%s\n",a);
 86     putchar('+');
 87     for(int i=1;i<=sum-bn-1;i++)
 88         putchar(' ');
 89     printf("%s\n",b);
 90     putchar(' ');
 91     putchar(' ');
 92     for(int i=1;i<=n;i++)
 93         putchar('-');
 94     putchar('\n');
 95     putchar(' ');
 96     putchar(' ');
 97     printf("%s\n\n",c);
 98 }
 99 int main()
100 {
101     #ifdef test
102     #endif
103     //freopen("poj2166.in","r",stdin);
104     f[0]=1LL;
105     f[1]=2LL;
106     for(int i=2;i<41;i++)
107         f[i]=f[i-1]+f[i-2];
108     for(int i=0;i<=40;i++)
109         v.push_back(f[i]);
110     while(1)
111     {
112         long long x=scan();
113         //printf("%lld\n",x);
114         if(x==-1)
115             break;
116         long long y=scan();
117         if(y==-1)
118             break;
119         long long ans=x+y;
120         //long long ttt=40LL;
121         //while(ttt>0)
122         //{
123             //printf("%d\n",id(ttt));
124             //printf("%lld\n",f[id(ttt)]);
125             //ttt-=f[id(ttt)];
126         //}
127         //strcpy(a,get(40LL));
128         //printf("%s\n",a);
129         strcpy(a,get(x));
130         strcpy(b,get(y));
131         strcpy(c,get(ans));
132         print();
133     }
134     return 0;
135 }

 

posted @ 2017-04-12 11:14  BBBob  阅读(183)  评论(0编辑  收藏  举报