标题:求斐波那契数列N项,求助!
只看楼主
好烦、
Rank: 2
等 级:论坛游民
帖 子:78
专家分:72
注 册:2020-10-10
结帖率:87.5%
已结贴  问题点数:20 回复次数:13 
求斐波那契数列N项,求助!
输入其他值没问题输入1或2就出133,,,
#include<stdio.h>
int main(void)
{
    int N,f1,f2,i,A;
    f1=1;
    f2=1;
    scanf("%d",&N);
    if(N<=2)
        printf("1");
    if(N>2)
    {
        for(i=3;i<=N;i++)
        {   
            A=f1+f2;
            f1=f2;
            f2=A;
        }
    }
    printf("%d",A%2000000003);
    return 0;
}
搜索更多相关主题的帖子: int 数列 printf 斐波那契 输入 
2020-10-27 18:38
风过无痕1989
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:8
帖 子:228
专家分:1050
注 册:2020-7-17
得分:1 
回复 楼主 好烦、
程序代码:
#include<stdio.h>
int main(void)
{
    int N,f1,f2,i,A;
    f1 = 1;
    f2 = 1;
    scanf("%d",&N);
    if(N > 2)
    {
        for(i = 3;i <= N;i++)
        {   
            A = f1 + f2;
            f1 = f2;
            f2 = A;
        }
        printf("%d\n",A);
    }
    else if(N <= 2)
        printf("1\n");

    return 0;
}
2020-10-27 20:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:1 
如果N==2,你相当于执行了下面的代码
  int A;
        printf("1");
    printf("%d",A%2000000003);
那A值是多少?这是“未定义行为”
2020-10-27 20:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:18 
printf("%d",A%2000000003);
从 A%2000000003 看,这道题不可能让你慢吞吞的一个个计算过去,你应该用“矩阵运算 & 快速幂”,我懒得写,你参考一下吧 https://bbs.bccn.net/viewthread.php?tid=481332&page=1#pid2645909

在你源代码上改,代码应该是
程序代码:
#include <stdio.h>

int main(void)
{
    unsigned n;
    scanf( "%d", &n );

    unsigned a=0, b=1;
    for( unsigned i=0; i!=n; ++i )
    {
        unsigned c = a+b;
        a = b;
        b = c%2000000003;
    }
    printf( "%u", a%2000000003 );
}
2020-10-27 21:08
好烦、
Rank: 2
等 级:论坛游民
帖 子:78
专家分:72
注 册:2020-10-10
得分:0 
回复 4楼 rjsp
谢谢大佬!
2020-10-28 19:42
好烦、
Rank: 2
等 级:论坛游民
帖 子:78
专家分:72
注 册:2020-10-10
得分:0 
回复 4楼 rjsp
那为什么我原来的不行啊
2020-10-28 19:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 6楼 好烦、
我在3楼说了你错误的原因了呀,你 printf("1"); 之后又 printf("%d",A%2000000003);

   
2020-10-28 19:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 5楼 好烦、
不谢,我帮你写一个完整的吧

程序代码:
#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)%2000000003;\
        unsigned long long t01 = (a##00*b##01+a##01*b##11)%2000000003;\
        unsigned long long t10 = (a##10*b##00+a##11*b##10)%2000000003;\
        unsigned long long t11 = (a##10*b##01+a##11*b##11)%2000000003;\
        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%2000000003;

    #undef MUL
}

int main( void )
{
    unsigned n;
    scanf( "%u", &n );
    printf( "%llu\n", fibonacci(n) );
}
2020-10-28 19:58
好烦、
Rank: 2
等 级:论坛游民
帖 子:78
专家分:72
注 册:2020-10-10
得分:0 
回复 7楼 rjsp
这个我后来改了,但是在OJ上还是不行,会不会可能是数据溢出啊
2020-10-28 20:06
好烦、
Rank: 2
等 级:论坛游民
帖 子:78
专家分:72
注 册:2020-10-10
得分:0 
回复 8楼 rjsp
这个我更看不懂了。。。
2020-10-28 20:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503656-1-1.html




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

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