2015-11-01 108 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