我到底在做什么错?
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;
}
我正在编写一个程序来识别用户输入的数字是否为斐波那契数。该程序运行良好并且它做了它需要做的事情,但我试图让程序在用户输入一个不是 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;
}