2015-11-01 65 views
1

我有一個任務,我必須寫fibonacci的序列,然後打印它的前n個數字,其中n由用戶輸入。我寫的是:斐波那契序列錯誤C

#include <stdio.h> 
int main(int argc, char*argv[]){ 

int n, i, seq[n]; 
scanf("%d", &n); 
seq[0]=0; seq[1]=1; 
for(i=2; i<n; i++) 
seq[i]=seq[i-1]+seq[i-2]; 

for(i=0; i<n; i++) 
printf("%d ", seq[i]); 
return(0); 
} 

這工作,直到n等於或大於九。假設你輸入8,序列將會是0 1 1 2 3 5 8 13。如果輸入9或更大,則序列看起來像這樣0 1 1 2 3 5 8 13 21 -9(一串隨機數)。

任何能指出問題的人? Thx提前。

+1

使用縮進。使用大括號。檢查來自'scanf'的返回值 –

+1

對於這個想法,當對'seq [n]' –

回答

2

seq[n]是一個可變長度數組大小n,其是未初始化在該點處,導致未定義的行爲。

改爲調用scanf第一一些價值轉移到n然後定義int seq[n]

int n, i; 
scanf("%d", &n); 
int seq[n]; 

您還可以使用malloc

int n, i; 
assert(1 == scanf("%d", &n)); 
int* seq = malloc(n * sizeof(*seq)); 

不要忘記調用free事後,雖然!

+0

thx知道'n'的值時,代碼是否是通靈的,但我不允許使用malloc函數。我在我的C語言課程的開始,我們幾乎沒有過去的陳述 –

+1

@DavideCocomazzi你仍然可以使用可變長度數組,然後,如我的答案中所述... – Downvoter

4

在聲明int n, i, seq[n];之前,您需要使用值n來設置數組的長度。未初始化變量的行爲未定義。

您不需要一個數組來執行此分配,如上所述。你只需要記住最後和當前的斐波那契數值。總結它們以產生新的,然後遷移當前 - >最後和新 - >當前。將該邏輯置於由n控制的循環中。

+0

謝謝你的回答。能夠使用數組來解決問題 –

+1

是的,您可以通過在獲得'n'的值後創建數組來完成。但是,如果兩種正確的解決方案都可以在線性時間內工作,那麼爲什麼您需要需要更多資源的解決方案? – pjs