很容易推出长度为i的串所包含的数为一个斐波那契数列。然后就很容易了,先推出串的长度,然后递归打印就行了。不过打印的时候必须把性质推清楚,不然很容易出问题。
#include <iostream>
#include <cstdio>
using namespace std;
int f[50],d[50];
void print(int dep,int cur)
{
if(dep==2)
{
if(cur==1) cout<<0<<0;
if(cur==2) cout<<0<<1;
if(cur==3) cout<<1<<0;
return;
}
if(dep==1)
{
if(cur==2) cout<<1;
if(cur==1) cout<<0;
return;
}
if(dep<1) return;
if(f[dep+1]<cur)
{
cout<<10;
print(dep-2,cur-f[dep+1]);
}
else
{
cout<<0;
print(dep-1,cur);
}
}
int main()
{
freopen("in.txt","r",stdin);
f[1]=f[2]=1;
d[1]=1;d[2]=2;
for(int i=3;i<=40;i++)
{
f[i]=f[i-1]+f[i-2];
d[i]=f[i]+d[i-1];
}
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
if(n==1)
{
cout<<1<<endl;
continue;
}
int p=1;
while(d[p]<n) p++;
n-=d[p-1];
cout<<10;
print(p-2,n);
cout<<endl;
}
return 0;
}