1613551 发表于 2023-6-30 22:23:03

关于布尔函数的问题

不知道为什么,我无法正常编译布尔函数

1613551 发表于 2023-6-30 22:23:21

#include <stdio.h>

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

      for (i = 5; i < 10000; i++)
      {
                for (j = 2; j < i / 2; j++)
                {
                        if (i % j == 0)
                        {
                              flag = 0;
                              break;
                        }
                }

                if (flag)
                {
                        count++;
                }
                else
                {
                        flag = 1;
                }
      }

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

      return 0;
}

sfqxx 发表于 2023-6-30 22:25:12

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

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

修正后的代码如下所示:

#include <stdio.h>

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

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

      for (j = 2; j <= i / 2; j++)
      {
            if (i % j == 0)
            {
                flag = 0;
                break;
            }
      }

      if (flag)
      {
            count++;
      }
    }

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

    return 0;
}
通过以上修改,你的布尔函数应该能够正常编译并得到正确结果。注意,这里使用了`_Bool`类型表示布尔值,其取值只能是0和1。你也可以使用`bool`类型,并包含`<stdbool.h>`头文件。

isdkz 发表于 2023-6-30 22:33:09

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

#include <stdio.h>

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

      for (i = 5; i < 10000; i++)
      {
                flag = 1;
                for (j = 2; j <= i / 2; j++)
                {
                        if (i % j == 0)
                        {
                              flag = 0;
                              break;
                        }
                }

                if (flag)
                {
                        count++;
                }
      }

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

      return 0;
}


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

以下是改进后的代码:

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

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

      for (i = 5; i < 10000; i++)
      {
                flag = 1;
                for (j = 2; j <= sqrt(i); j++)
                {
                        if (i % j == 0)
                        {
                              flag = 0;
                              break;
                        }
                }

                if (flag)
                {
                        count++;
                }
      }

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

      return 0;
}

这个代码比原来的代码运行得更快。

sfqxx 发表于 2023-6-30 22:39:58

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

不要抢我的{:10_249:}

isdkz 发表于 2023-6-30 22:42:19

sfqxx 发表于 2023-6-30 22:39
不要抢我的

我也还差一个{:10_256:}

sfqxx 发表于 2023-6-30 22:46:48

isdkz 发表于 2023-6-30 22:42
我也还差一个

{:10_243:}

sfqxx 发表于 2023-6-30 22:47:32

isdkz 发表于 2023-6-30 22:42
我也还差一个

我不能让歌者文明清理员电摇我

歌者文明清理员 发表于 2023-6-30 23:30:52

本帖最后由 歌者文明清理员 于 2023-6-30 23:50 编辑

sfqxx 发表于 2023-6-30 22:47
我不能让歌者文明清理员电摇我

https://img.youxi369.com/article/contents/2022/05/30/2022053022721718.gif

歌者文明清理员 发表于 2023-7-1 00:20:22

sfqxx 发表于 2023-6-30 22:46


{:10_243:}{:10_266:}{:5_100:}{:9_220:}{:7_119:}{:10_258:}{:10_265:}{:10_324:}
(心情曲线)

python/print 发表于 2023-7-1 07:46:53

* _Bool的B是大写的,且前面有下划线,应改为bool
代码如下
#include <stdio.h>

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

      for (i = 5; i < 10000; i++)
      {
                for (j = 2; j < i / 2; j++)
                {
                        if (i % j == 0)
                        {
                              flag = 0;
                              break;
                        }
                }

                if (flag)
                {
                        count++;
                }
                else
                {
                        flag = 1;
                }
      }

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

      return 0;
}

1613551 发表于 2023-7-2 20:23:48

python/print 发表于 2023-7-1 07:46
* _Bool的B是大写的,且前面有下划线,应改为bool
代码如下

{:10_254:}我记得小甲鱼讲的是布尔变量是需要首字母大写且前面要加横杠的

python/print 发表于 2023-7-5 19:13:57

1613551 发表于 2023-7-2 20:23
我记得小甲鱼讲的是布尔变量是需要首字母大写且前面要加横杠的

那应该是编译器的区别,我一直不加
页: [1]
查看完整版本: 关于布尔函数的问题