打印斐波那契数列时,数组打印出奇怪的问号符号
Array is printing with weird question mark symbols when printing fibonacci sequences
当打印每个斐波那契数列时,前几个数列以奇怪的符号打印,如果打印超过 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))
。您只为一个元素分配 space,而不是 n
。您应该改为 malloc(n * sizeof(*seq))
。
不是真正的错误,但在 main
的第一个 for
循环中,您正在重新定义和重新分配 seq
int *seq = realloc(...)
数组。那根本不需要。您的数组已经 n
个单元格大,因此无需每次都重新分配它。您可以按原样使用它。
不是真正的错误,但不需要每次都重新计算系列。您可以只计算一次,然后在每一行上部分打印它而不会出现问题。
此外,重要! 使用 int
来保存斐波那契数列的数字只有在达到 n = 47
之前才有用。不仅如此,您的下一个元素将溢出 int
可以容纳的最大正值,变为负值,并使其余计算也无效。我建议您改为使用 long long unsigned int
,这对 n = 94
(假设 64 位)来说是很好的。最后,您应该在计算 Fibonacci 数列之前检查 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;
}
当打印每个斐波那契数列时,前几个数列以奇怪的符号打印,如果打印超过 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))
。您只为一个元素分配 space,而不是n
。您应该改为malloc(n * sizeof(*seq))
。不是真正的错误,但在
main
的第一个for
循环中,您正在重新定义和重新分配seq
int *seq = realloc(...)
数组。那根本不需要。您的数组已经n
个单元格大,因此无需每次都重新分配它。您可以按原样使用它。不是真正的错误,但不需要每次都重新计算系列。您可以只计算一次,然后在每一行上部分打印它而不会出现问题。
此外,重要! 使用 int
来保存斐波那契数列的数字只有在达到 n = 47
之前才有用。不仅如此,您的下一个元素将溢出 int
可以容纳的最大正值,变为负值,并使其余计算也无效。我建议您改为使用 long long unsigned int
,这对 n = 94
(假设 64 位)来说是很好的。最后,您应该在计算 Fibonacci 数列之前检查 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;
}