当打印每个 Fibonacci 序列时,前几个序列以奇怪的符号打印,或者如果打印超过 8 个序列则根本不打印。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
//n=amount of numbers in the series to compute, seq=array to store series
void fibonacci(int n, int* seq){
// Complete this function
int i;
seq[0] = 0;
seq[1] = 1;
for(i = 2; i <= n; i++){
seq[i] = seq[i-2] + seq[i-1];
}
}
int main(){
int n;
//n, amount of series to compute
scanf("%d",&n);
//initialize array to 1, using malloc/calloc
int *seq = malloc(1 * sizeof(*seq));
int i;
for(i = 1; i <= n; i++){
//recompute the whole series
fibonacci(i, seq);
//print array
int j;
for(j = 0; j < i; j++)/* complete code */
printf("%d ", seq[j]);
//resize array, with realloc
int newSize=i+1;
int *seq = realloc(seq, newSize);
printf("\n");
}
//free array
return 0;
}
输出:
"7Y��yb�=
Um�*/E�o 1 1 2 3 5 8 13
0 1 1 2 3 5 8 13 21
0 1 1 2 3 5 8 13 21 34
0 1 1 2 3 5 8 13 21 34 55
0 1 1 2 3 5 8 13 21 34 55 89
0 1 1 2 3 5 8 13 21 34 55 89 144
0 1 1 2 3 5 8 13 21 34 55 89 144 233
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946
最佳答案
您的代码中存在不同的问题:
在你的
fibonacci()
函数,您使用i <= n
进行迭代,但在循环内,您分配给seq[i]
.当i
=n
,这就成了一个问题:您正在访问数组中的一个单元格。你得到
n
来自用户输入,然后执行int *seq = malloc(1 * sizeof(*seq))
.您只为一个元素分配空间,而不是n
.你应该做malloc(n * sizeof(*seq))
相反。不是真正的错误,而是在第一个
for
中在你的main
中循环,您正在重新定义和重新分配seq
数组int *seq = realloc(...)
.那根本不需要。您的阵列已经是n
单元格很大,所以不需要每次都重新分配它。您可以按原样使用它。不是真正的错误,但不需要每次都重新计算系列。您可以只计算一次,然后毫无问题地将其部分打印在每一行上。
另外,重要!使用int
持有斐波那契数列的数字只有在你到达 n = 47
之前才有用。 .不仅如此,您的下一个元素将溢出 int
的最大正值。可以保持,变为负数,并使其余计算也无效。我建议你使用 long long unsigned int
相反,这会很好直到 n = 94
(假设 64 位)。最后,您应该检查 n
的值在计算斐波那契数列之前避免溢出。
这是修复了这些问题的更好版本的代码:
void fibonacci(int n, int* seq) {
int i;
seq[0] = 0;
seq[1] = 1;
for(i = 2; i < n; i++)
seq[i] = seq[i-2] + seq[i-1];
}
int main() {
int *seq;
int n, i, j;
scanf("%d",&n);
// Allocate enough space for n elements:
seq = malloc(n * sizeof(*seq));
// Compute the whole series once:
fibonacci(n, seq);
// Print partial series on each row:
for(i = 1; i <= n; i++) {
for(j = 0; j < i; j++)
printf("%d ", seq[j]);
printf("\n");
}
free(seq);
return 0;
}
关于c - 打印斐波那契数列时,数组打印出奇怪的问号符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57532368/