鱼C论坛

 找回密码
 立即注册
查看: 1848|回复: 17

[已解决]我这个程序是用来计算一个数是不是素数的,然后这个程序有个很奇怪的bug

[复制链接]
发表于 2022-4-7 16:06:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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;
}
最佳答案
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 那个地方确实是多余的。

总结来说,画蛇添足了。
uTools_1649383943348.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-7 18:57:18 | 显示全部楼层
b=1 // 先假设这个数是一个素数
for

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

                }
问题 就在这里, 如果一个数不是素数还有必要循环下去吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 09:27:43 | 显示全部楼层
本帖最后由 1613551 于 2022-4-8 10:01 编辑
ba21 发表于 2022-4-7 18:57
b=1 // 先假设这个数是一个素数
for


你这个道理我看懂了,但是我那个程序的bug是,我引用的那一段,它不执行if里面的,只执行else里面的,我是等于0的话不是素数,等于1是素数,它就一直执行else里面的=1,因为我在后面又打印了bool b的值,我发现一直是1,就导致无论输入什么都是一个素数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-8 09:56:17 From FishC Mobile | 显示全部楼层
1613551 发表于 2022-4-8 09:27
你这个道理我看懂了,但是我那个程序的bug是,我引用的那一段,它不执行if里面的,只执行else ...

if (num % a == 0) {
                        b = 0;后面添加一个break
否则会遭遇覆盖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 那个地方确实是多余的。

总结来说,画蛇添足了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 10:07:09 | 显示全部楼层
wp231957 发表于 2022-4-8 09:56
if (num % a == 0) {
                        b = 0;后面添加一个break
否则会遭遇覆盖

if语句是不能加break吗,我加了以后一直报错?好像在switch里面就没有这种问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

break 是为了 跳出循环 。你可以发一下报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 10:13:05 | 显示全部楼层
一阵三十六 发表于 2022-4-8 10:10
break 是为了 跳出循环 。你可以发一下报错。

我已经加上了,你刷新一下应该能看到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-8 10:26:15 | 显示全部楼层
本帖最后由 一阵三十六 于 2022-4-8 10:32 编辑

初始化 布尔类型变量 b



1649384668(1).jpg


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

1649385141(1).jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 10:32:22 | 显示全部楼层
好像还是不行
uTools_1649385109363.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 10:33:13 | 显示全部楼层
一阵三十六 发表于 2022-4-8 10:26
初始化 布尔类型变量 b

我不理解,我的程序已经和你一样了,图已经发到楼上了,难道是我编译器的问题?这个编译器太简陋了嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的分号是半角分号???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-8 10:38:36 | 显示全部楼层
wp231957 发表于 2022-4-8 10:35
你的分号是半角分号???

我看着也像中文的分号 ;;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 11:04:32 | 显示全部楼层
一阵三十六 发表于 2022-4-8 10:38
我看着也像中文的分号 ;;

这....还真是的...这真是太丢脸了...因为以往输入输入中文的符号它都是直接用红色标记出来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 11:05:16 | 显示全部楼层
wp231957 发表于 2022-4-8 10:35
你的分号是半角分号???

是的..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 11:06:50 | 显示全部楼层

这实在太丢脸了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-8 11:09:33 | 显示全部楼层
一阵三十六 发表于 2022-4-8 10:38
我看着也像中文的分号 ;;

不行,这个bug是解决不了了,一个要给bool一个值才行,如果在=0后面加上了break,就永远等于0了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


等于0的条件是 判断出了 这个数 不是素数了啊
都判断出来了再循环干啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 00:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表