我正在编写一个程序来识别用户输入的数字是否是斐波那契数。这个程序运行得很好,它做了它需要做的事情,但当用户输入一个不是一的数字时,我试图让程序说它不是斐波那契数,它不起作用,我不确定我需要调整什么。
这是代码:
#include <stdio.h>
int main() {
int number;
int flag = 0;
int a = 0;
int b = 1;
int NextTerm;
printf("this is a program to determine if a number is a Fibonacci numbern");
printf("please enter your numbern");
printf("the number you entered is : ");
scanf("%d", &number);
while (true) {
NextTerm = a + b;
a = b;
b = NextTerm;
if (a == number) {
flag = 1;
break;
}
}
if (flag == 1) {
printf("The number you entered which is %d is a Fibonacci Numbern", number);
} else
if (flag == 0) {
printf("The number you entered which is %d is not a Fibonacci Numbern", number);
}
return 0;
}
问题是当当前斐波那契数a
大于number
时,不能停止循环。因此,您继续枚举斐波那契数,直到a + b
导致算术溢出,此时您的程序具有未定义的行为。在当前系统上,循环继续模232,直到达到与number
匹配的值a
。这个循环是否真的停止是一个有趣但独立的问题,但结果将是不正确的,因为如果循环停止,flag
将被设置为1
。
要解决这个问题,只需在while
循环体的末尾添加if (a > number) break;
即可。
请注意,应该测试b
而不是a
,以避免将0
报告为斐波那契数。
这是一个简化版本:
#include <stdio.h>
int main() {
int number;
int a = 0;
int b = 1;
printf("This is a program to determine if a number is a Fibonacci numbern");
printf("please enter your number: ");
if (scanf("%d", &number) != 1)
return 1;
while (b < number) {
int NextTerm = a + b;
a = b;
b = NextTerm;
}
if (b == number) {
printf("The number you entered which is %d is a Fibonacci Numbern", number);
} else {
printf("The number you entered which is %d is not a Fibonacci Numbern", number);
}
return 0;
}