我正在尝试打印斐波那契数列的前80个术语,但是在某些范围数字看来是负数之后。那么这是正确的吗?
这里是代码:
#include <stdio.h>
int main() {
int i,first_term=0, second_term=1, next_term;
for(i=0; i<80; i++)
{
printf("%d, ",first_term);
next_term= first_term + second_term;
first_term=second_term;
second_term = next_term;
}
return 0;
}
这是由于整数溢出。
斐波纳契数不能为负。
我建议您如下使用long
或long long int
:
#include <stdio.h>
int main() {
int i;
long long int first_term=0, second_term=1, next_term;
for(i=0; i<80; i++)
{
printf("%lld, ",first_term);
next_term= first_term + second_term;
first_term=second_term;
second_term = next_term;
}
return 0;
}
PS:斐波那契数列增长非常快。当数字越过无符号long long int的上限long long int
时,unsigned long long int
甚至18,446,744,073,709,551,615
可能再次溢出。因此,BigInt for C ++将是有益的。
是的,您的公式是正确的。但是,斐波那契数列中的数字快速增长,因此您的整数溢出。例如,如果使用long
而不是int
,则可以获得更正确的数字。
#include <stdio.h>
int main(){
unsigned int i;
unsigned long long first_term=0, second_term=1, next_term;
for(i=0; i<80; i++)
{
printf("%llu, ",first_term);
next_term= first_term + second_term;
first_term=second_term;
second_term = next_term;
}
return 0;
}
Fibinacci系列项不能为负。在某些条件下,您会得到负值,因为在某些条件下,这些值会变得太大,以至于超出整数数据类型(2或4字节)的范围。因此,您应该使用字符串格式或使用长数据类型。只需将%d
替换为%lu
。变成:
#include <stdio.h>
int main() {
int i;
long first_term=0, second_term=1, next_term;
for(i=0; i<80; i++)
{
printf("%lu, ",first_term);
next_term= first_term + second_term;
first_term=second_term;
second_term = next_term;
}
return 0;
}