我有一个作业,我必须编写斐波那契的序列,然后打印前n个数字,其中n由用户输入。我写的是:
#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等于或大于9才有效。假设您输入8,则序列将为0 1 1 2 3 5 8 13。如果输入9或更大,则序列看起来像这样0 1 1 2 3 5 8 13 21 -9(随机数串)。
任何可以指出问题的人? Thx提前。
答案 0 :(得分:4)
在值int n, i, seq[n];
之前声明n
以设置数组的长度。未初始化变量的行为未定义。
如上所述,您不需要数组来执行此分配。您只需要记住最后和当前的斐波纳契值。求它们产生新的,然后迁移电流 - &gt;最后和新的 - &gt;当前。将该逻辑放在由n
控制的循环中。
答案 1 :(得分: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
!