UVa Live-3357 Pinary(斐波那契+找规律)

来源:互联网 发布:小米6陶瓷 知乎 编辑:程序博客网 时间:2024/06/07 10:30
#include<iostream>#include<cstring>#include<cmath>#define MAX 90000000+1using namespace std;int main(){int T;long long k;long long fac[47];long long sum[47];fac[0]=fac[1]=1;sum[0]=1;sum[1]=2;for(int i=2;i<=40;i++){fac[i]=fac[i-1]+fac[i-2];sum[i]=sum[i-1]+fac[i];}cin>>T;while(T--){cin>>k;int time=0;int g=0;int flag=0,flag2=1,all=0;while(k>0){for(int i=0;i<50;i++){if(sum[i]>=k){flag=i+1;if(flag2) all=flag;//all记录原始长度flag2=0;break;}}for(int i=1;i<g-flag;i++){    cout<<"0";    time++;}    cout<<"1";time++;k=k-1-sum[flag-2];g=flag;}if(time!=all){for(int i=1;i<=all-time;i++) cout<<"0";//最后补上0}cout<<endl;}return 0; } 

比如k=31(1010010),对应着7位,先输出1,然后k缩减至10(10010),对应着5位,于是输出1个0(7-5-1);然后再输出1,k继续缩减至2(10),对应着2位,于是输出2个0(5-2-1);然后再输出1,此时k=0了      可以用一个all保存原始位数的长度,然后用time表示我们已经处理的位数,即每次输出或0后,time++,最后剩余的位数all-time用0补完

0 0
原创粉丝点击