1. 程式人生 > >小題大收穫--裴波那契數列

小題大收穫--裴波那契數列

入門訓練 Fibonacci數列

問題描述
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>
#define M 10007
int main(void)
{
    long n, i,temp,a1,a2,sum=0;
    a1 = a2 = 1;
    scanf("%ld", &n);

    for(i=1; i<=n; i++)
    {
        sum=a1%M;
        temp = a2;
        a2 = (a1+a2)%M;  //這裡我寫的是a2 = a1 + a2,因為我認為一旦 a1+a2>M a2的值就不對了呀!!!
        a1 = temp;

    }
    printf("%ld"
, sum); return 0; }

總結

這段程式碼的主要問題在註釋那一部分,我提交的是a2 = a1+a2結果是錯的。
該過程相當於是把後一項的值賦給a2,把a2原來的值賦給a1,因此我認為,當a1+a2>M時,若還是取餘,就有問題了…

方法二

#include <stdio.h>
#include <stdlib.h>
#define M 1000001
#define N 10007
int a[M], n, i;
int main(void)
{
    scanf("%d", &n);
    a[1]=1;
    a[2
]=1; for(i=3;i<=n;i++) { a[i] = (a[i-1] + a[i-2])%N; } printf("%d",a[n]); return 0; }

總結

全域性變數在靜態儲存區分配記憶體,區域性變數是在棧上分配記憶體空間的。
(c語言程式在執行時會動態建立一個堆疊段,裡面存放著呼叫棧,儲存著函式的呼叫關係和區域性變數。)
如果陣列太大,可能會造成棧溢位。
因此大陣列要放在main函式外定義