我到底在做什么错?

What am I doing wrong here exactly?

我正在编写一个程序来识别用户输入的数字是否为斐波那契数。该程序运行良好并且它做了它需要做的事情,但我试图让程序在用户输入一个不是 1 的数字时说它不是斐波那契数,它不工作,我'我不确定我需要调整什么。

代码如下:

#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 number\n");
    printf("please enter your number\n");
    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 Number\n", number);
    } else
    if (flag == 0) {
        printf("The number you entered which is %d is not a Fibonacci Number\n", 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 number\n");
    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 Number\n", number);
    } else {
        printf("The number you entered which is %d is not a Fibonacci Number\n", number);
    } 
    return 0; 
}