Chinaunix首页 | 论坛 | 博客
  • 博客访问: 652265
  • 博文数量: 128
  • 博客积分: 4385
  • 博客等级: 上校
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 14:05
文章分类

全部博文(128)

文章存档

2012年(2)

2011年(51)

2010年(75)

分类: C/C++

2010-12-13 17:56:32

 Fibonacci number,后一个数是前面两个数的和。

    第一种方法,循环相加求和,实现如下:
/***********************************************************************************************
 * 斐波拉契著名的数学问题,即斐波拉契数列 1 1 2 3 5 8 13 ......
 * 假设每对兔子每月能生一对小兔子,小兔子长到第3个月时也开始生兔子。假设兔子不会死,问第n个月有多少个兔子
 * 显然,从第三个数字开始,每个数字都是前两个数字之和。
 * *************************************************************************************/

#include

int main()        /* 确定第n个Fibonacci numbedr, n从0开始 */
{
    int i, n, sum0 = 1, sum1 = 1, sum = 0;
    scanf("%d", &n);
    if(n<0)
        printf("Input is error. ");
    else
    {
        if(n<2)
            sum = sum0 = sum1 = 1;
        else
        {
            for(i=2;i<=n;i++)
            {
                sum = sum1 + sum0;
                sum0 = sum1;
                sum1 = sum;
            }
        }
        printf("Fibonacci(%d) is %d ", n, sum);
           
    }
    return 0;
}


    2、另一种简单的方法,就是利用函数的递归调用,实现如下:
/********************************************
 * 用函数递归调用的方法来求Fibonacci number;
 * 显然,f(0) = f(1) = 1;
 * f(n) = f(n-1)+f(n-2)
 * ******************************************/


#include

int f(int);

int main()
{
    int n, i, fib=0;
    scanf("%d", &n);

    for(i=0; i
    {
        fib = f(i);
        printf("Fibonacci(%d) is %d ", i, fib);
    }

    return 0;
}

int f(int n)
{
    int fib=0;

    if(n==0 || n==1)
        fib = 1;
    else
        fib = f(n-1)+f(n-2);        /* 函数f递归调用 */

    return fib;
}


    上面两种方法都只对小的数字有效,如果要求数字比较大的Fibonacci number,比如求
Fibonacci(30),显然,任何数据类型的取值范围都不能满足。这时,就要用到前面的大数相加的自定义函数了。
阅读(1567) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~