| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 798 人关注过本帖
标题:求助各位大神,C语言问题
只看楼主 加入收藏
赵256
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-12-10
收藏
 问题点数:0 回复次数:3 
求助各位大神,C语言问题
斐波那契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……。在数学上,斐波纳契数列以递推的方法定义为:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N)。计算斐波那契数列第n项的值。

输入格式:

输入一个大于等于1,小于等于60的整数n。

输出格式:

输出第n项的数列值,数列值为double类型,不输出小数位数。
#include<stdio.h>
int fib(int n)
{
    int c;
    if(n==1||n==2)
    {
        c=1;
    }
    else if(n>2&&n<=60)
        c=fib(n-1)+fib(n-2);
    return c;
}
int main()
{
    int n;
    scanf("%d",&n);
    printf("%d\n",fib(n));
    return 0;
}
我的编程是这个,但是是部分正确,有一个测试点是运行超时
搜索更多相关主题的帖子: 输出 int 数列 C语言 输入 
2021-12-10 17:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
即使用最普通的方法,从左到右一个个计算,也只需要60次。而你这个递归方法,我大体估计一下需要几亿次。
除非你有 恋递归癖,否则我想不通你用递归的原因。

顺便说一下,求斐波纳契数列,可以用“矩阵 {{1,1},{1,0}}”幂,配合“快速幂算法”,只需要log2(n)次,Google一下就出来了。
当然,60不算大,用矩阵的话,代码就复杂了些。我还是倾向于你使用最朴素的方法,从左到右老实地相加。
另一种作弊的方法就是查表了,一共就60个数。

矩阵法:
程序代码:
#include <stdio.h>

unsigned long long fibonacci( unsigned n )
{
    // a *= b
    #define MUL(a,b) do {\
        unsigned long long t00 = (a##00*b##00+a##01*b##10);\
        unsigned long long t01 = (a##00*b##01+a##01*b##11);\
        unsigned long long t10 = (a##10*b##00+a##11*b##10);\
        unsigned long long t11 = (a##10*b##01+a##11*b##11);\
        a##00=t00, a##01=t01, a##10=t10, a##11=t11;\
    } while(0)

    unsigned long long r00=1,r01=0,r10=0,r11=1;
    for( unsigned long long v00=0,v01=1,v10=1,v11=1; n!=0; n/=2 )
    {
        if( n%2 == 1 )
            MUL(r,v); // r*=v
        MUL(v,v); // v*=v;
    }
    return r01;

    #undef MUL
}

int main( void )
{
    printf( "%llu\n", fibonacci(1) );
    printf( "%llu\n", fibonacci(2) );
    printf( "%llu\n", fibonacci(3) );
    printf( "%llu\n", fibonacci(4) );
    printf( "%llu\n", fibonacci(5) );
    printf( "%llu\n", fibonacci(6) );
    
    unsigned n;
    scanf( "%u", &n );
    printf( "%llu\n", fibonacci(n) );
}
2021-12-10 22:52
赵256
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-12-10
收藏
得分:0 
回复 楼主 赵256
我是刚学c语言的,刚刚学到函数这一节,就会递归这一种方法啊.
2021-12-11 15:02
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 3楼 赵256
怎么可能正常简单的方法不会,却会糟糕复杂的方法?

程序代码:
#include <stdio.h>

unsigned long long fibonacci( unsigned n )
{
    unsigned long long a=1, b=0;
    for( unsigned i=0; i!=n; ++i )
    {
        b = b+a;
        a = b-a;
    }
    return b;
}

int main( void )
{
    unsigned n;
    scanf( "%u", &n );
    printf( "%llu\n", fibonacci(n) );
}
2021-12-11 16:51
快速回复:求助各位大神,C语言问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017274 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved