小題大收穫--裴波那契數列
阿新 • • 發佈:2019-01-28
入門訓練 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函式外定義