gpt4 book ai didi

c - 斐波那契数生成器在 N>47 时中断

转载 作者:行者123 更新时间:2023-11-30 18:43:49 25 4
gpt4 key购买 nike

在一项家庭作业中,我们被要求创建一个斐波那契数生成器,其中提到要记录 N(项数)超过 46 时的行为。

这是我的代码:

#include <stdio.h>

int main(void) {
int N;
int i;
int fn, fi, fj;
fj = 1;
fi = 1;
FILE *fp;
fp = fopen("fibb.txt", "w");

printf("Enter the number of terms");
scanf("%d", &N);
for (i = 1; i <= N; i++) {
if (i == 1 || i == 2) {
fprintf(fp, "%d\n", fi);
} else {
fn = fi + fj;
fj = fi;
fi = fn;
fprintf(fp, "%d\n", fn);
}
}
fclose(fp);
return 0;
}

fibb.txt 文件:

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
-1323752223
512559680
-811192543
-298632863

为什么会有负数?该代码可以很好地预测小 N 的斐波那契数。这些数字对于 c 来说是否太大而无法存储,或者是否存在内存分配问题?我认为这些数字不应该太大而无法存储,因为它们只是 10 位数字。

最佳答案

这就是所谓的“有符号溢出”。这意味着您尝试存储大于类型可以存储的数字。从形式上来说,它会导致未定义的行为。切换到更大的整数类型,例如 longlong long。由于您使用的所有数字都是正数,因此还要考虑无符号类型,例如 unsigned long long

与您可能读到的相反,有符号溢出是明确的未定义行为:

C17 第 3.4.3/3 段

EXAMPLE An example of undefined behavior is the behavior on integer overflow

关于c - 斐波那契数生成器在 N>47 时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60018812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com