首页 > 代码库 > 斐波那契数列题型ACing

斐波那契数列题型ACing

斐波那契数列

特点:头两项均为1,后面任一项都是其前两项之和。

程序在计算中需要用两个变量存储最近产生的两个序列值,且产生了新数据后,两个变量要更新。

 

问题1:输出斐波那契数列的前十项。

    int i,x1,x2,x;
    x1=1;  //头两项都是1 
    x2=1;
    printf("%6d%6d",x1,x2);
    for(i=1;i<=8;i++){  //循环输出后8项 
        x=x1+x2;  //计算新项 
        printf("%6d",x);
        x1=x2;  //更新x1和x2,为下一次计算新项x作准备
        x2=x; 
    }
    printf("\n");
    return 0;

技术分享

 

或者:

    int i;
    int fib[10]={1,1};  //数组初始化,生成斐波那契数列前两个数
    
    for(i=2;i<10;i++)
        fib[i]=fib[i-1]+fib[i-2];
    
    for(i=2;i<10;i++){
        printf("%6d",fib[i]);
        if((i+1)%5 == 0)  //每输出5个数就换行
            printf("\n"); 
    } 
    return 0;

 

 
 

问题2:

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。
 
由于数值太大,我们要先找到它的周期:
#include <stdio.h>

int main( void )
{
    // f(-1)=1, f(0)=0, f(1)=1; f(n)=[f(n-1)+f(n-1)]%10007
    unsigned cycle = 1;
    for( unsigned a=0,b=1; !(a==1&&b==0); ++cycle )
    {
        unsigned c = (a+b)%10007;
         a = b;
         b = c;
    }

    printf( "cycle = %u\n", cycle ); // 20016

    return 0;
}

 输出结果为20016。

 

此时我们知道,当n=20016时,输出值为0;n=20017时,输出值为1...

所以我们可以写出以下代码:

#include <stdio.h>

int main( void )
 {
     unsigned n;
     scanf( "%u", &n );
     n %= 20016;

     unsigned a=1, b=0;
     while( n-- )
     {
         unsigned c = (a+b)%10007;
         a = b;
         b = c;
     }
     printf( "%u", b );

     return 0;
 }

 

 
 
 
 
 
 
 
 
 
 
 
 

斐波那契数列题型ACing