hdoj4814(思维)

题目链接: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("\n");
    }
    return 0;
}

 

posted @ 2020-03-16 12:54  Frank__Chen  阅读(155)  评论(0编辑  收藏  举报