我这个程序是用来计算一个数是不是素数的,然后这个程序有个很奇怪的bug
本帖最后由 1613551 于 2022-4-8 10:12 编辑为什么我在当if(num % a == 0) 为真,b=0后面加上 else,b=1,然后这个程序就计算不了素数了,b的值一直是1了,然后只有在Bool b后面使b=1,不用else才能实现这个程序的功能,也就是第二个程序那样子
有bug的程序
#include <stdio.h>
int main() {
int num, a;
_Bool b ;
printf("请输入一个数");
scanf("%d", &num);
for (a = 2; a < num / 2; a++) {
if (num % a == 0) {
b = 0;
} else {
b = 1;
}
}
if (0 == b) {
printf("%d不是一个素数", num);
} else {
printf("%d是一个素数", num);
}
没有bug的程序
#include <stdio.h>
int main() {
int num, a;
_Bool b = 1 ;
printf("请输入一个数");
scanf("%d", &num);
for (a = 2; a < num / 2; a++) {
if (num % a == 0) {
b = 0;
}
}
if (0 == b) {
printf("%d不是一个素数", num);
} else {
printf("%d是一个素数", num);
}
return 0;
} b=1 // 先假设这个数是一个素数
for
if (num % a == 0) {
b = 0; // 不是素数
break; // 既然不是素数还else干嘛,退出循环节约资源不好
}
问题 就在这里, 如果一个数不是素数还有必要循环下去吗?
本帖最后由 1613551 于 2022-4-8 10:01 编辑
ba21 发表于 2022-4-7 18:57
b=1 // 先假设这个数是一个素数
for
{:10_266:}你这个道理我看懂了,但是我那个程序的bug是,我引用的那一段,它不执行if里面的,只执行else里面的,我是等于0的话不是素数,等于1是素数,它就一直执行else里面的=1,因为我在后面又打印了bool b的值,我发现一直是1,就导致无论输入什么都是一个素数 1613551 发表于 2022-4-8 09:27
你这个道理我看懂了,但是我那个程序的bug是,我引用的那一段,它不执行if里面的,只执行else ...
if (num % a == 0) {
b = 0;后面添加一个break
否则会遭遇覆盖 本帖最后由 一阵三十六 于 2022-4-8 10:10 编辑
因为后面循环的问题:
举个例子: num = 9 (num 不是一个素数)
a从2-4遍历
for 循环里,
9%2 == 1 那么b = 1
9%3 == 0 那么b = 0
9%4 == 1 那么b = 1
看这个过程 9%4之后完全是多余的,因为已经判断出 num 不是一个素数了。
你这个bug就在else 那
我想到两种改法,一种是答案那种。
另一种是在 这个有问题的程序下 在语句 b = 0; 下面写 break;
但是这个改法很鸡肋。不如直接去掉else那里。
因为 else 那个地方确实是多余的。
总结来说,画蛇添足了。 wp231957 发表于 2022-4-8 09:56
if (num % a == 0) {
b = 0;后面添加一个break
否则会遭遇覆盖
if语句是不能加break吗,我加了以后一直报错?好像在switch里面就没有这种问题 1613551 发表于 2022-4-8 10:07
if语句是不能加break吗,我加了以后一直报错?好像在switch里面就没有这种问题
break 是为了 跳出循环 。你可以发一下报错。 一阵三十六 发表于 2022-4-8 10:10
break 是为了 跳出循环 。你可以发一下报错。
我已经加上了,你刷新一下应该能看到 本帖最后由 一阵三十六 于 2022-4-8 10:32 编辑
初始化 布尔类型变量 b
因为没有初始化 b ,
被赋成了0;
好像还是不行 一阵三十六 发表于 2022-4-8 10:26
初始化 布尔类型变量 b
我不理解,我的程序已经和你一样了,图已经发到楼上了,难道是我编译器的问题?这个编译器太简陋了嘛 1613551 发表于 2022-4-8 10:33
我不理解,我的程序已经和你一样了,图已经发到楼上了,难道是我编译器的问题?这个编译器太简陋了嘛
你的分号是半角分号??? wp231957 发表于 2022-4-8 10:35
你的分号是半角分号???
我看着也像中文的分号 ;; 一阵三十六 发表于 2022-4-8 10:38
我看着也像中文的分号 ;;
这....还真是的...这真是太丢脸了...因为以往输入输入中文的符号它都是直接用红色标记出来的 wp231957 发表于 2022-4-8 10:35
你的分号是半角分号???
是的.. 1613551 发表于 2022-4-8 11:05
是的..
{:10_282:}这实在太丢脸了 一阵三十六 发表于 2022-4-8 10:38
我看着也像中文的分号 ;;
不行,这个bug是解决不了了,一个要给bool一个值才行,如果在=0后面加上了break,就永远等于0了 1613551 发表于 2022-4-8 11:09
不行,这个bug是解决不了了,一个要给bool一个值才行,如果在=0后面加上了break,就永远等于0了
?
等于0的条件是 判断出了 这个数 不是素数了啊
都判断出来了再循环干啥?
页:
[1]