题意:
把一个10进制数变成 x进制数 x = (1+√5)/2
思路:
比赛时候就被无理数进制吓傻了 其实完全没必要 因为 n = n * 1 = n * x^0
由于x的0次幂等于1 所以完全可以把n当成对应的x进制数的个位 现在要做的就是把这个数转化成二进制
题目给出的公式可以在两边同时乘x的若干次幂 那么这两个式子就变成了
x^(i+1) + x^i = x^(i+2)
2 * x^i = x^(i+1) + x^(i-2)
通过这两个式子不停的去变换数字 直到数字不再变了就停下来输出
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100 int a[N*2]; int n,u,v; int main() { int i,k,flag; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); a[N]=n; do { flag=0; for(i=0;i<N*2-2;i++) { if(a[i]&&a[i+1]) { k=min(a[i],a[i+1]); a[i]-=k; a[i+1]-=k; a[i+2]+=k; flag=1; } } for(i=2;i<N*2-1;i++) { if(a[i]>1) { k=a[i]/2; a[i]%=2; a[i-2]+=k; a[i+1]+=k; flag=1; } } }while(flag); for(u=2*N-1;u>N&&!a[u];u--); for(v=0;v<N&&!a[v];v++); for(i=u;i>=N;i--) printf("%d",a[i]); if(v!=N) { printf("."); for(i=N-1;i>=v;i--) printf("%d",a[i]); } printf("\n"); } return 0; }
HDU 4814 Golden Radio Base,布布扣,bubuko.com
原文:http://blog.csdn.net/houserabbit/article/details/36036903