標籤:hdu 想法 數學
題意:
把一個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 100int 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;}