斐波那契序列C程序错误

时间:2018-06-21 06:48:25

标签: c fibonacci

我正在尝试编写一个程序,该程序将斐波那契数列的前2个数字作为输入,并将n的值作为输入。然后程序给出斐波那契数列第n位的输出。

#include <stdio.h>
#include <stdlib.h>

int main () {
    int n, i;
    int s[n - 1];
    int a, b;   

    printf("Enter two first two numbers:");
    scanf("%d %d", &a, &b);
    printf("Enter the value of n(3-100):");
    scanf("%d", &n);

    for (i = 2; i <= n - 1; i++) {
        s[i] = s[i - 1] + s[i - 2];
    }

    printf("The nth digit is %d", s[n - 1]);

    return(0);
}

我得到的是答案号码,后面是一些其他任意数字

3 个答案:

答案 0 :(得分:1)

您在这里定义了一个未知大小的数组,很幸运n并非恰好是0或1或负数。

int s[n-1];

这里您忽略了scanf的返回值,您应该检查该值以验证扫描是否成功。

scanf("%d %d",&a,&b);
scanf("%d",&n);

即使假设有意义地定义了数组,您也可以在此处设置循环以产生超出数组的索引:

for (i=2 ; i<=n-1 ; i++)

然后您在数组之外(在循环的最后一次迭代中)在此处写:

s[i]=

使用此代码,所有的赌注都消失了,您保证了未定义的行为,因此,对于到底出了什么问题的任何解释都是徒劳的。

答案 1 :(得分:1)

几件事。如前所述,您试图在使用n之前先赋予它一个值。另外,在使用变量确定数组大小时,应使用malloc()

接下来,如果您要计算第n个和,则需要该数组包含n个元素,而不是n-1

第三,您读入两个起始值ab,但从未使用它们来初始化数组的前两个元素。

最后,您需要修复循环索引。 (实际上,一旦将数组更改为具有n个元素而不是n-1个元素,您的索引就可以了,但是,当然首选使用i < n而不是i <= n-1

int main() {
    int n, i;
    int a, b;

    printf("Enter two first two numbers:");
    scanf("%d %d", &a, &b);
    printf("Enter the value of n(3-100):");
    scanf("%d", &n);

    int *s = malloc(n * sizeof(*s));

    s[0] = a;
    s[1] = b;

    for (i = 2; i < n; i++) {
        s[i] = s[i - 1] + s[i - 2];
    }

    printf("The nth digit is %d", s[n - 1]);

    return(0);
}

答案 2 :(得分:1)

实际上,要实现您的代码,不需要数组s[]

这可以简单地实现为:-

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i;
    int a, b;

    printf("Enter two first two numbers:");
    scanf("%d%d", &a, &b);                      // not scanf("%d %d", &a, &b);
    printf("Enter the value of n(3-100):");
    scanf("%d", &n);

    for (i = 1; i < n; i++)
    {
        b += a;
        a = b - a;
    }

    printf("The nth digit is %d\n", a);

    return (0);
}

输出:

Enter two first two numbers:0 1
Enter the value of n(3-100):5
The nth digit is 3                     // 0 1 1 2 3