1613551 发表于 2022-4-7 16:06:55

我这个程序是用来计算一个数是不是素数的,然后这个程序有个很奇怪的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;
}

ba21 发表于 2022-4-7 18:57:18

b=1 // 先假设这个数是一个素数
for

if (num % a == 0) {
                        b = 0; // 不是素数
                        break; // 既然不是素数还else干嘛,退出循环节约资源不好

                }
问题 就在这里, 如果一个数不是素数还有必要循环下去吗?

1613551 发表于 2022-4-8 09:27:43

本帖最后由 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,就导致无论输入什么都是一个素数

wp231957 发表于 2022-4-8 09:56:17

1613551 发表于 2022-4-8 09:27
你这个道理我看懂了,但是我那个程序的bug是,我引用的那一段,它不执行if里面的,只执行else ...

if (num % a == 0) {
                        b = 0;后面添加一个break
否则会遭遇覆盖

一阵三十六 发表于 2022-4-8 10:06:13

本帖最后由 一阵三十六 于 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 那个地方确实是多余的。

总结来说,画蛇添足了。

1613551 发表于 2022-4-8 10:07:09

wp231957 发表于 2022-4-8 09:56
if (num % a == 0) {
                        b = 0;后面添加一个break
否则会遭遇覆盖

if语句是不能加break吗,我加了以后一直报错?好像在switch里面就没有这种问题

一阵三十六 发表于 2022-4-8 10:10:00

1613551 发表于 2022-4-8 10:07
if语句是不能加break吗,我加了以后一直报错?好像在switch里面就没有这种问题

break 是为了 跳出循环 。你可以发一下报错。

1613551 发表于 2022-4-8 10:13:05

一阵三十六 发表于 2022-4-8 10:10
break 是为了 跳出循环 。你可以发一下报错。

我已经加上了,你刷新一下应该能看到

一阵三十六 发表于 2022-4-8 10:26:15

本帖最后由 一阵三十六 于 2022-4-8 10:32 编辑

初始化 布尔类型变量 b






因为没有初始化 b ,
被赋成了0;

1613551 发表于 2022-4-8 10:32:22

好像还是不行

1613551 发表于 2022-4-8 10:33:13

一阵三十六 发表于 2022-4-8 10:26
初始化 布尔类型变量 b

我不理解,我的程序已经和你一样了,图已经发到楼上了,难道是我编译器的问题?这个编译器太简陋了嘛

wp231957 发表于 2022-4-8 10:35:20

1613551 发表于 2022-4-8 10:33
我不理解,我的程序已经和你一样了,图已经发到楼上了,难道是我编译器的问题?这个编译器太简陋了嘛

你的分号是半角分号???

一阵三十六 发表于 2022-4-8 10:38:36

wp231957 发表于 2022-4-8 10:35
你的分号是半角分号???

我看着也像中文的分号 ;;

1613551 发表于 2022-4-8 11:04:32

一阵三十六 发表于 2022-4-8 10:38
我看着也像中文的分号 ;;

这....还真是的...这真是太丢脸了...因为以往输入输入中文的符号它都是直接用红色标记出来的

1613551 发表于 2022-4-8 11:05:16

wp231957 发表于 2022-4-8 10:35
你的分号是半角分号???

是的..

1613551 发表于 2022-4-8 11:06:50

1613551 发表于 2022-4-8 11:05
是的..

{:10_282:}这实在太丢脸了

1613551 发表于 2022-4-8 11:09:33

一阵三十六 发表于 2022-4-8 10:38
我看着也像中文的分号 ;;

不行,这个bug是解决不了了,一个要给bool一个值才行,如果在=0后面加上了break,就永远等于0了

一阵三十六 发表于 2022-4-8 11:12:22

1613551 发表于 2022-4-8 11:09
不行,这个bug是解决不了了,一个要给bool一个值才行,如果在=0后面加上了break,就永远等于0了


等于0的条件是 判断出了 这个数 不是素数了啊
都判断出来了再循环干啥?
页: [1]
查看完整版本: 我这个程序是用来计算一个数是不是素数的,然后这个程序有个很奇怪的bug