【问题标题】:Array is printing with weird question mark symbols when printing fibonacci sequences打印斐波那契序列时,数组打印出奇怪的问号符号
【发布时间】:2019-12-23 05:38:05
【问题描述】:

打印每个斐波那契数列时,前几个数列以奇怪的符号打印,如果打印超过 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 

【问题讨论】:

  • 在第一次迭代中,seq 可以在seq[0] 中保存一个值,但是您尝试将两个值存储到其中(在seq[1] 中);这会导致您的输出和关于 SO 的问题非常不愉快、钻石等。为什么不简单地分配 (n + 1) * sizeof(*seq) 字节而忘记重新分配?

标签: c arrays symbols fibonacci


【解决方案1】:

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

  1. 在您的fibonacci() 函数中,您使用i &lt;= n 进行迭代,但在循环内部,您分配给seq[i]。当i = n 时,就会出现问题:您正在访问数组中的一个单元格。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多