HDU - 4814-B - Golden Radio Base-模拟(题意很可以)

连接 http://acm.hdu.edu.cn/showproblem.php?pid=4814
黄金比例转换,可以根据题中的公式得到两个公式。
然后就对数
题意:
给你一个十进制数,让你把他转化成Q进制数,Q是黄金分割比 = (1+√5)/2.
思路:
首先要明确的就是虽然q是实数,但是依然可以转换成q进制数,因为任何数num,都有 num = num * 1 => num = num * q^0,先把所有的数字都放在各位,然后在根据题目的要求吧他转化成所有的数字都是0或者1,不能有两个连续的1,两个公式。
Q^n = Q^(n-1) + Q^(n-2)
2*Q^n = Q^(n+1) + Q^(n-2)
这样对于全都转换成0,1,我们可以先把所有的数字num都放在个位,然后在根据
2*Q^n = Q^(n+1) + Q^(n-2)把大于1的数字分解,一直分解到所有数字小于等于1
对于连续的11我们可以Q^n = Q^(n-1) + Q^(n-2)分解连续的1,有一点要注意的就是这两个处理要同时做,因为分解11可能会产生大于1的数字,所以两个一起弄(一起的意思就是while(!ok){处理问题1;处理问题2;}),直到所有的都满足条件就行了。
有一个重要的地方就是计算有多少位数,计算得到 那个权值为 1.6,和二进制差不多,乘以2肯定可以啦!

#include <bits/stdc++.h>
using namespace std;
//题意,看了快两天了在各路大神的帮忙下,终于看懂了,
// 给定一个数,然后计算他的黄金分割比进制下的数;
// 可以推知两个公式。
//这道模拟总共我找到了三种写法,
//这是第一种,
#include <bits/stdc++.h>
using namespace std;
//题意,看了快两天了在各路大神的帮忙下,终于看懂了,
// 给定一个数,然后计算他的黄金分割比进制下的数;
// 可以推知两个公式。
//这道模拟总共我找到了三种写法,
//这是第一种,
const int maxn=300;
int a[maxn];
int main()
{   int n,i;
    while(~scanf("%d",&n))
     {    memset(a,0,sizeof(a));
          a[50]=n;//因为是从50开始变化的,所以

         bool flag=true;
          while(flag)
          {  flag=false;
            for(int i=0;i<maxn-2;i++)
            {   if(a[i]&&a[i+1])
                {   int t=min(a[i],a[i+1]);
                      a[i]-=t;
                      a[i+1]-=t;
                      a[i+2]+=t;
                      flag=true;
                }

            }
              for(int i=2;i<maxn-1;i++)
              {   if(a[i]>1)
                   {  a[i+1]+=a[i]/2;
                       a[i-2]+=a[i]/2;
                       a[i]=a[i]%2;
                       flag=true;
                   }
              }
          }
          //for(int i=40;i<=55;i++)
             //cout<<a[i];
            //cout<<endl;
          int x,y,t;
          for( x=maxn;x>=50&&!a[x];x--);
           for(y=0;y<=50&&!a[y];y++);
           //cout<<x<<y<<endl;
            for(t=x;t>=50;t--)
                printf("%d",a[t]);
             if(y!=50)
             {printf(".");
              for(int x=49;x>=y;x--)
                 printf("%d",a[x]);

             }
          cout<<endl;


     }



    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值