鱼C论坛

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

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

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

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

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

x
不知道为什么,我无法正常编译布尔函数
最佳答案
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;
}
uTools_1688134855179.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> 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`的值。

修正后的代码如下所示:
#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>`头文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
这个代码比原来的代码运行得更快。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

我也还差一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

使用道具 举报

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

我不能让歌者文明清理员电摇我
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

发表于 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;
}

评分

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

查看全部评分

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

使用道具 举报

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

我记得小甲鱼讲的是布尔变量是需要首字母大写且前面要加横杠的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那应该是编译器的区别,我一直不加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 09:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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