c-我到底做错了什么

  • 本文关键字:错了 c loops fibonacci
  • 更新时间 :
  • 英文 :


我正在编写一个程序来识别用户输入的数字是否是斐波那契数。这个程序运行得很好,它做了它需要做的事情,但当用户输入一个不是一的数字时,我试图让程序说它不是斐波那契数,它不起作用,我不确定我需要调整什么。

这是代码:

#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; 
}

最新更新