题目链接:https://vjudge.net/problem/HDU-4814
题意:将十进制数转换为phi进制。phi为黄金分割率,phi=(1+√5)/2。
思路:
- 应用公式2*phi(n)=phi(n+1)+phi(n-2)可以将第n位的>1的数字转换成0/1。
- 应用公式phi(n-2)+phi(n-1)=phi(n)可以将连续的1消除。
- 1e9的数在phi进制中大致为50位,对于a[200],令i=100为个位,即最开始a[100]=n,然后循环利用上述两条应用得到最终答案。
AC code:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=205; int a[maxn],flag,n; int main(){ while(~scanf("%d",&n)){ memset(a,0,sizeof(a)); a[100]=n; flag=1; while(flag){ flag=0; for(int i=2;i<maxn-1;++i) if(a[i]>1){ a[i-2]+=a[i]/2; a[i+1]+=a[i]/2; a[i]%=2; flag=1; } for(int i=0;i<maxn-2;++i) if(a[i]&&a[i+1]){ int tmp=min(a[i],a[i+1]); a[i]-=tmp; a[i+1]-=tmp; a[i+2]+=tmp; flag=1; } } int l=0,r=maxn-1; while(l<100&&!a[l]) ++l; while(r>100&&!a[r]) --r; for(int i=r;i>=100;--i) printf("%d",a[i]); if(l!=100){ printf("."); for(int i=99;i>=l;--i) printf("%d",a[i]); } printf(" "); } return 0; }