hdu1021 Fibonacci Again(C语言)

该博客探讨了一种特殊的斐波那契数列,其中F(0) = 7, F(1) = 11,并通过C语言提供了两种计算方法来检查数列中的数是否能被3整除。博主分享了两种ACM竞赛的解决方案,并给出了斐波那契数列的递推关系。文章最后提到了斐波那契数列在兔子繁殖问题、青蛙跳台阶问题等场景的应用。" 104979807,9072263,Android NestedScrollView详解与使用,"['Android开发', 'UI组件', '滚动视图']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).
 

Input
Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000).
 

Output
Print the word "yes" if 3 divide evenly into F(n).

Print the word "no" if not.
 

Sample Input
0 1 2 3 4 5
 

Sample Output
no no yes no no no
 

Author
Leojay



C语言AC代码
法一:
#include<stdio.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if((n-2)%4==0)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}
思路:找到循环规律。F(0)=7,F(1)=11,F(2)=18,F(3)=29,F(4)=47,F(5)=76,F(6)=123,F(7)=199,F(8)=322,F(9)=521,F(10)=843。可以看出F(2),F(6),F(10)是可以被三整除的,所以得出(n-2)%4==0这个判断条件。

法二:
#include<stdio.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int a[100000],i;
        for(i=2;i<=n;i++)
            a[0]=7;a[1]=11;
        {
            a[i]=a[i-1]+a[i-2];
        }
        if(a[n]%3==0)
            printf("yes\n");
        else 
            printf("no\n");
    }
    return 0;
}

思路:先求出F(n),然后在判断是否可以整除3即可。



斐波那契数列 
http://open.163.com/movie/2014/2/N/O/M9HKRT25D_M9HNA0UNO.html//一个很好看的TED,《神奇的斐波那契数列》。
数学家列昂纳多·斐波那契(Leonardoda Fibonacci)
以兔子繁殖为例子而引入,故又称为“兔子数列”,
指的是这样一个数列:
1、1、2、3、5、8、13、21、34、……
在数学上,斐波纳契数列以如下被以递归的方法定义:
F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)


兔子繁殖问题
斐波那契数列又因数学家列昂纳多·斐波那契
以兔子繁殖为例子而引入,故又称为“兔子数列”。
一般而言,兔子在出生两个月后,就有繁殖能力,
一对兔子每个月能生出一对小兔子来。
如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,
因为小兔子还没有繁殖能力,所以一共是三对
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数
总体对数=本月成兔对数+本月幼仔对数
可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。
这个数列有关十分明显的特点,那是:
前面相邻两项之和,构成了后一项。
这个数列是意大利中世纪数学家斐波那契在
<算盘全书>中提出的,这个级数的通项公式,
除了具有a(n+2)=an+a(n+1)的性质外,
还可以证明通项公式为:
an=(1/√5)*{[(1+√5)/2]^n-[(1-√5)/2]^n}
(n=1,2,3.....)
斐波那契数列的定义如下:
  f(n)=  0,      n=0;
  f(n)=  1,       n=1;
  f(n)=   f(n-1)+f(n-2),  n>1

看到这个定义,大多数人会想到使用递归实现。
因为代码简洁,但是使用递归会重复计算很多结果,
严重影响时间效率,因此我们可以从下往上计算,
根据f(0)和f(1)计算出f(2),然后根据f(1)和f(2)计算出f(3),
以此类推,就可以算出第n项了,时间复杂度为o(n),具体实现代码如下:
#include<stdio.h>  
  
int facii(int n)  
{  
  int a[]={0,1};  
  int i=0,x1=0,x2=1,x3=0;  
  
  if(n<2)    
      return a[n];  
         
  for(i=2;i<=n;i++)  
  {  
    x3=x1+x2;  
    x1=x2;  
    x2=x3;  
  }  
  return x3;  
}  
  
int main()  
{  
  int n,y;  
  scanf("%d",&n);  
  y=facii(n);  
  printf("%d\n",y);  
}  
还有一些问题实际上也是斐波那契数列的应用,
比如青蛙跳台阶问题
(一次可以跳1级台阶,也可以跳2级台阶,求n级台阶有多少种跳法)。
 首先考虑最见到的情况,只有1级台阶,
有一种跳法,有2级台阶,则有两种跳法:
分两次跳,一次跳1级,分一次跳,一次跳2级。
然后在讨论一般情况,n级台阶,
如果第一次跳1级,则跳法数目等于剩下n-1级台阶的跳法,
如果第一次跳2级,则跳法数目等于剩余n-2级台阶的跳法,
则这就是斐波那契数列的简单应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值