【问题标题】:What am I doing wrong here exactly?我在这里到底做错了什么?
【发布时间】:2020-12-23 02:14:27
【问题描述】:

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

代码如下:

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

【问题讨论】:

  • NextTerm大于用户输入的数字时,还需要break循环。
  • 不工作是否意味着您陷入了无限循环?
  • 你应该正确缩进你的代码以便它可读。可读的代码使您更容易在代码中找到错误。并正确命名您的变量。既然可以叫isFibonacciNumber,为什么还要叫它flag
  • 不,我的意思是卡住,因为当数字不是斐波那契数时,它不会打印,循环工作正常
  • @Jabberwocky 对不起,我还是个初级程序员

标签: c loops fibonacci


【解决方案1】:

问题是当当前斐波那契数a 大于number 时,您不会停止循环。因此,您继续枚举斐波那契数,直到 a + b 导致算术溢出,此时您的程序具有未定义的行为。在当前系统上,循环继续模 232 直到达到与 number 匹配的 a 值。这个循环是否真的停止是一个有趣但独立的问题,但结果将不正确,因为如果循环停止,flag 将被设置为1

要解决此问题,您只需在 while 循环体的末尾添加 if (a &gt; 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; 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2013-06-28
    • 2023-01-19
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多