打印斐波那契数列时,数组打印出奇怪的问号符号

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 

您的代码中存在不同的问题:

  1. 在您的 fibonacci() 函数中,您使用 i <= n 进行迭代,但在循环内,您分配给 seq[i]。当 i = n 时,这就变成了一个问题:您正在访问数组中的一个单元格。

  2. 您正在从用户输入中获得 n,但随后执行 int *seq = malloc(1 * sizeof(*seq))。您只为一个元素分配 space,而不是 n。您应该改为 malloc(n * sizeof(*seq))

  3. 不是真正的错误,但在 main 的第一个 for 循环中,您正在重新定义和重新分配 seq int *seq = realloc(...) 数组。那根本不需要。您的数组已经 n 个单元格大,因此无需每次都重新分配它。您可以按原样使用它。

  4. 不是真正的错误,但不需要每次都重新计算系列。您可以只计算一次,然后在每一行上部分打印它而不会出现问题。

此外,重要! 使用 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;
}