鱼C论坛

 找回密码
 立即注册
查看: 1402|回复: 12

[已解决]关于布尔函数的问题

[复制链接]
发表于 2023-6-30 22:23:03 | 显示全部楼层 |阅读模式

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

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

x
不知道为什么,我无法正常编译布尔函数
最佳答案
2023-7-1 07:46:53
* _Bool的B是大写的,且前面有下划线,应改为bool
代码如下
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int count = 2; // 已知2和3是素数
  5.         int i, j;
  6.         bool flag = 1;

  7.         for (i = 5; i < 10000; i++)
  8.         {
  9.                 for (j = 2; j < i / 2; j++)
  10.                 {
  11.                         if (i % j == 0)
  12.                         {
  13.                                 flag = 0;
  14.                                 break;
  15.                         }
  16.                 }

  17.                 if (flag)
  18.                 {
  19.                         count++;
  20.                 }
  21.                 else
  22.                 {
  23.                         flag = 1;
  24.                 }
  25.         }

  26.         printf("10000以内共有%d个素数!\n", count);

  27.         return 0;
  28. }
复制代码
uTools_1688134855179.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-30 22:23:21 | 显示全部楼层
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int count = 2; // 已知2和3是素数
  5.         int i, j;
  6.         _Bool flag = 1;

  7.         for (i = 5; i < 10000; i++)
  8.         {
  9.                 for (j = 2; j < i / 2; j++)
  10.                 {
  11.                         if (i % j == 0)
  12.                         {
  13.                                 flag = 0;
  14.                                 break;
  15.                         }
  16.                 }

  17.                 if (flag)
  18.                 {
  19.                         count++;
  20.                 }
  21.                 else
  22.                 {
  23.                         flag = 1;
  24.                 }
  25.         }

  26.         printf("10000以内共有%d个素数!\n", count);

  27.         return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 22:25:12 | 显示全部楼层
你的布尔函数编译不正常的原因是变量`flag`未被正确初始化。在你的代码中,`flag`的初始值设为1,代表素数,但在每次外层循环开始时,并未将`flag`重置为1。这导致内层循环结束后,`flag`可能仍然为0,从而导致错误的计数。

你可以将内层循环修改为如下形式:`for (j = 2; j <= i / 2; j++)`,将等号放入判断条件中。同时,在每次外层循环开始时,添加一行代码`flag = 1;`来重置`flag`的值。

修正后的代码如下所示:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int count = 2; // 已知2和3是素数
  5.     int i, j;
  6.     _Bool flag = 1;

  7.     for (i = 5; i < 10000; i++)
  8.     {
  9.         flag = 1; // 重置flag的值

  10.         for (j = 2; j <= i / 2; j++)
  11.         {
  12.             if (i % j == 0)
  13.             {
  14.                 flag = 0;
  15.                 break;
  16.             }
  17.         }

  18.         if (flag)
  19.         {
  20.             count++;
  21.         }
  22.     }

  23.     printf("10000以内共有%d个素数!\n", count);

  24.     return 0;
  25. }
复制代码

通过以上修改,你的布尔函数应该能够正常编译并得到正确结果。注意,这里使用了`_Bool`类型表示布尔值,其取值只能是0和1。你也可以使用`bool`类型,并包含`<stdbool.h>`头文件。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 22:33:09 | 显示全部楼层
这个代码是用来计算10000以内素数个数的,但存在一点小错误。你需要将判断 flag 是否为 true 的部分放在内部循环结束之后,而不是放在外部循环中。这是因为 flag 只有在检查完所有小于 i/2 的数之后才能确认 i 是否为素数。这是修正后的代码:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int count = 2; // 已知2和3是素数
  5.         int i, j;
  6.         _Bool flag;

  7.         for (i = 5; i < 10000; i++)
  8.         {
  9.                 flag = 1;
  10.                 for (j = 2; j <= i / 2; j++)
  11.                 {
  12.                         if (i % j == 0)
  13.                         {
  14.                                 flag = 0;
  15.                                 break;
  16.                         }
  17.                 }

  18.                 if (flag)
  19.                 {
  20.                         count++;
  21.                 }
  22.         }

  23.         printf("10000以内共有%d个素数!\n", count);

  24.         return 0;
  25. }
复制代码


另外,这个代码中的素数判断算法并不是最高效的。我们知道,一个合数一定可以表示为两个自然数的乘积,如果这两个数相等,那么它们就是这个合数的平方根;如果它们不相等,那么其中一个数小于平方根,另一个大于平方根。所以,只要小于或等于这个数的平方根的数(从2开始)不能整除这个数,那么这个数就是质数。

以下是改进后的代码:

  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.         int count = 2; // 已知2和3是素数
  6.         int i, j;
  7.         _Bool flag;

  8.         for (i = 5; i < 10000; i++)
  9.         {
  10.                 flag = 1;
  11.                 for (j = 2; j <= sqrt(i); j++)
  12.                 {
  13.                         if (i % j == 0)
  14.                         {
  15.                                 flag = 0;
  16.                                 break;
  17.                         }
  18.                 }

  19.                 if (flag)
  20.                 {
  21.                         count++;
  22.                 }
  23.         }

  24.         printf("10000以内共有%d个素数!\n", count);

  25.         return 0;
  26. }
复制代码

这个代码比原来的代码运行得更快。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 22:39:58 | 显示全部楼层
isdkz 发表于 2023-6-30 22:33
这个代码是用来计算10000以内素数个数的,但存在一点小错误。你需要将判断 flag 是否为 true 的部分放在内 ...

不要抢我的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 22:42:19 | 显示全部楼层

我也还差一个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-6-30 22:46:48 | 显示全部楼层

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 22:47:32 | 显示全部楼层

我不能让歌者文明清理员电摇我
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2023-6-30 23:30:52 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-6-30 23:50 编辑
sfqxx 发表于 2023-6-30 22:47
我不能让歌者文明清理员电摇我


https://img.youxi369.com/article ... 022053022721718.gif
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-1 00:20:22 | 显示全部楼层


(心情曲线)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-1 07:46:53 | 显示全部楼层    本楼为最佳答案   
* _Bool的B是大写的,且前面有下划线,应改为bool
代码如下
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int count = 2; // 已知2和3是素数
  5.         int i, j;
  6.         bool flag = 1;

  7.         for (i = 5; i < 10000; i++)
  8.         {
  9.                 for (j = 2; j < i / 2; j++)
  10.                 {
  11.                         if (i % j == 0)
  12.                         {
  13.                                 flag = 0;
  14.                                 break;
  15.                         }
  16.                 }

  17.                 if (flag)
  18.                 {
  19.                         count++;
  20.                 }
  21.                 else
  22.                 {
  23.                         flag = 1;
  24.                 }
  25.         }

  26.         printf("10000以内共有%d个素数!\n", count);

  27.         return 0;
  28. }
复制代码

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
1613551 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-2 20:23:48 | 显示全部楼层
python/print 发表于 2023-7-1 07:46
* _Bool的B是大写的,且前面有下划线,应改为bool
代码如下

我记得小甲鱼讲的是布尔变量是需要首字母大写且前面要加横杠的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 19:13:57 | 显示全部楼层
1613551 发表于 2023-7-2 20:23
我记得小甲鱼讲的是布尔变量是需要首字母大写且前面要加横杠的

那应该是编译器的区别,我一直不加
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 15:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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