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

标签 c arrays symbols fibonacci

当打印每个 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 

最佳答案

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

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

  2. 你得到 n来自用户输入,然后执行 int *seq = malloc(1 * sizeof(*seq)) .您只为一个元素分配空间,而不是 n .你应该做 malloc(n * sizeof(*seq))相反。

  3. 不是真正的错误,而是在第一个 for 中在你的 main 中循环,您正在重新定义和重新分配 seq数组 int *seq = realloc(...) .那根本不需要。您的阵列已经是 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;
}

关于c - 打印斐波那契数列时,数组打印出奇怪的问号符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57532368/

相关文章:

CUDA c 程序奇怪的行为 - 内核工作直到我添加更多操作

c - 与结构相关的语法斗争

java - 掷骰子 - ArrayIndexOutOfBounds

linux - 使用 g++ 的符号可见性

c++ - 奇怪的符号、文本和实际字符在数组中消失/改变

c - AIX 6.1 : CORE DUMP - GDB "thread apply all bt full" returns NOTHING?

c - 如何使用C打印UNIX应用程序内存的内存地址?

c - 如何通过引用返回结构数组?

c - 参数类型无效 C

f# - 为什么在 F# 中管道和何时之间需要一个虚拟符号文字?