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

    xiaoxiao2021-03-25  70

    #include<iostream> #include<cstring> #include<cmath> #define MAX 90000000+1 using 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补完

    转载请注明原文地址: https://ju.6miu.com/read-16909.html

    最新回复(0)