1113斐波那契数应用

斐波那契数应用

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:212            测试通过:133

描述

知道斐波那契数吗?下面是它的一个定义:

  • F1 = 1
  • F2 = 2
  • Fn+1 = Fn+Fn-1 这里n>1
  •  

    每个正整数可写为不同斐波那契数的总和因而意味着存在数和数 b1, b2, ..., bk使得x=b1*F1+ ...+ bi*Fi+ ... +bk*Fk其中bk = 1bi(1i < k)01。简言之我们可写为 b(x) = (bk, bk-1, ..., b1) 为使表示唯一我们要求对所有i > 1bi * bi-1 = 0

    利用斐波那契数我们可以将公里单位距离 x 转换为相应的英里单位距离 y首先以斐波那契系统表示b(x)写下x。其次b(x)中数字右移一位最后一位删除),得到b(y)。第三b(y)中计算总数来算出 y

    例如42以斐波那契系统表示为(1,0,0,1,0,0,0,0)。第二步,我们通过右移得到 (1,0,0,1,0,0,0)。第三步,我们计算0*1 + 0*2 + 0*3 + 1*5 + 0*8 + 0*13 + 1*21 = 26.

    下面请你写一个程序,根据上述算法将公里转换为英里。

    输入

    输入第一行包含t,需要转换的距离数目 (0<t<25000)。下面行的每一个包含一个整数距离x (2 < x < 25000)公里。

    输出

    对于每个距离公里,输出算出的英里。

    样例输入

    5
    42
    100
    180
    300
    360

    样例输出

    26
    62
    111
    185
    222

    题目来源

    “IBM南邮杯”团队赛2009



    这道题目首先要生成一个斐波那契数列(需要事先确定到底需要多少个即可),然后再不断相除,得到那个二进制序列。

    #include<iostream>
    #define N 22
    using namespace std;
    
    int array[N]={0};
    void Fibonacci()  // this function is used to generate the Fabonacci array
    {
         int i=0;     
         array[0]=1; array[1]=2;
         for(i=2; i<N; i++)
              array[i]=array[i-2]+array[i-1]; 
    }
    
    int main()
    {
         Fibonacci();  //first, we obtain the Fibonacci array.
    
         int n;
         cin>>n;
         while(n--)  // perfect
         {
              int gongli, yinli=0;
              cin>>gongli;  //input the gongli
    
              int i;
              int site[N];
              for(i=N-1; i>=0; i--)
              {
                   if(gongli>=array[i])  //search from the biggest one
                   {
                        gongli-=array[i];
                        site[i]=1;
                   //     cout<<array[i]<<endl;
                   }
                   else
                        site[i]=0;
              }
    
              for(i=1; i<N; i++)
                   yinli+=array[i-1]*site[i];  //move right one bit
    
              cout<<yinli<<endl;
    
         }
    
         return 0;
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值