鱼C论坛

 找回密码
 立即注册
查看: 1859|回复: 8

[已解决]寻找1000以内的素数

[复制链接]
发表于 2021-8-26 22:13:45 | 显示全部楼层 |阅读模式

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

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

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

int main()
{
        int j, i;
        _Bool flag;

        printf("1k以内的素数有:\n2\n");

        for (i=2;i <= 1000;i++)
        {
                for (j = 2;j <= i/2;j++)
                {
                        if (i % j == 0)
                        {
                                flag = 0;
                                break;
                        }
                }
                if (flag)
                {
                        printf("%d\n", i);
                }
                
        }



        return 0;
}




结果一直不对。。。。。

_Bool函数用不了,我这是vs2019.。。。
最佳答案
2021-8-27 09:45:57
本帖最后由 超过光速c 于 2021-8-27 09:48 编辑

你的第9行,里面多了一个2, printf("1k以内的素数有:\n2\n");

你的整体代码是没问题的,但是为什么无法打印完所有素数,
在每次对素数的判断循环后,你没有对 flag 进行重制,flag的值一旦被 赋值为 0 了,就一直是0。
所以,建议在第25行,也就是内for循环的每次素数判断循环完成后,对flag进行重制,重制为 1,即 flag = 1;

关于你使用。_Bool flag; 定义布尔类型什么会报错,我认为应该跟你的编辑器的编译器有关。我使用的是 vsCode 使用的 C/C++ v1.6.0 是能正常进行布尔类型定义的。

对你的代码进行修改后:
#include<stdio.h>
#include<math.h>

int main()
{
    int j, i;
    _Bool flag;

    printf("1k以内的素数有:\n");   // 修改位置1

    for (i=2;i <= 1000;i++)
    {
        for (j = 2;j <= i/2;j++)
        {
                if (i % j == 0)
                {
                        flag = 0;
                        break;
                }
        }
        if (flag)
        {
                printf("%d\n", i);
        }
        flag = 1;  // 修改位置2
    }
    return 0;
}
QQ截图20210826221023.png
QQ截图20210826221103.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-26 22:54:27 | 显示全部楼层
_Bool 不是函数,是关键字,是变量的类型
vs 不支持 _Bool,把 _Bool 改成 int 试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-26 23:08:05 | 显示全部楼层
本帖最后由 jackz007 于 2021-8-26 23:12 编辑
#include <stdio.h>

bool prime(int x)
{
        bool r = false                            ;
        int i                                     ;
        if(x > 1) {
                if(x % 2) {
                        for(r = true , i = 3 ; i * i < x + 1 ; i += 2) {
                                if(! (x % i)) {
                                        r = false ;
                                        break     ;
                                }
                        }
                } else {
                        if(x == 2) r = true       ;
                }
        }          
        return r                                  ;
}

int main(void)
{
        int i , k                                 ;
        for(i = k = 0 ; i < 1000 ; i ++) {
                if(prime(i)) {
                        if(! (k % 10)) {
                                if(k) printf("\n") ;
                        } else {
                                printf(" ")        ;
                        }
                        printf("%4d" , i)          ;
                        k ++                       ;
                }
        }
}
        使用 gcc 10.2.0 编译器编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
   2    3    5    7   11   13   17   19   23   29
  31   37   41   43   47   53   59   61   67   71
  73   79   83   89   97  101  103  107  109  113
 127  131  137  139  149  151  157  163  167  173
 179  181  191  193  197  199  211  223  227  229
 233  239  241  251  257  263  269  271  277  281
 283  293  307  311  313  317  331  337  347  349
 353  359  367  373  379  383  389  397  401  409
 419  421  431  433  439  443  449  457  461  463
 467  479  487  491  499  503  509  521  523  541
 547  557  563  569  571  577  587  593  599  601
 607  613  617  619  631  641  643  647  653  659
 661  673  677  683  691  701  709  719  727  733
 739  743  751  757  761  769  773  787  797  809
 811  821  823  827  829  839  853  857  859  863
 877  881  883  887  907  911  919  929  937  941
 947  953  967  971  977  983  991  997

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

使用道具 举报

发表于 2021-8-26 23:15:50 | 显示全部楼层
就这道题而言 flag只要用到1和0两个值  int直接用
#include <stdio.h>
int main()
{
        int n,i,j,count;
        scanf("%d",&n);
                for(i=2;i<n;i++)
                {
                        count=0;
                        for(j=2;j<i/2;j++)
                        {
                                if((i%j)==0)
                                {
                                        count=1;//一旦有一个能除尽的 就是合数了  直接跳出 
                                        break;
                                }
                        }
                        if(count==0)
                        printf("%d\n",i);
                }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-26 23:24:44 | 显示全部楼层
#include <stdbool.h>  用 bool试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-26 23:36:24 | 显示全部楼层
YaoShi 发表于 2021-8-26 23:15
就这道题而言 flag只要用到1和0两个值  int直接用

我搜了一下  标准c没有布尔类型  c++有
另外布尔值没什么特殊的   0和1而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-27 06:37:29 | 显示全部楼层
int main()
{
        int j, i;
        bool flag=1;///初始化赋值为真

        printf("1k以内的素数有:\n2\n");

        for (i=2;i <= 1000;i++)
        {
                for (j = 2;j <= i/2;j++)
                {
                        if (i % j == 0)
                        {
                                flag = 0;
                                break;
                        }
                }
                if (flag)
                {
                                        
                    printf("%d\n", i);
                }
                flag=1;///做完判断后重新初始化
               
        }



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

使用道具 举报

发表于 2021-8-27 06:44:37 | 显示全部楼层
YaoShi 发表于 2021-8-26 23:36
我搜了一下  标准c没有布尔类型  c++有
另外布尔值没什么特殊的   0和1而已

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

使用道具 举报

发表于 2021-8-27 09:45:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 超过光速c 于 2021-8-27 09:48 编辑

你的第9行,里面多了一个2, printf("1k以内的素数有:\n2\n");

你的整体代码是没问题的,但是为什么无法打印完所有素数,
在每次对素数的判断循环后,你没有对 flag 进行重制,flag的值一旦被 赋值为 0 了,就一直是0。
所以,建议在第25行,也就是内for循环的每次素数判断循环完成后,对flag进行重制,重制为 1,即 flag = 1;

关于你使用。_Bool flag; 定义布尔类型什么会报错,我认为应该跟你的编辑器的编译器有关。我使用的是 vsCode 使用的 C/C++ v1.6.0 是能正常进行布尔类型定义的。

对你的代码进行修改后:
#include<stdio.h>
#include<math.h>

int main()
{
    int j, i;
    _Bool flag;

    printf("1k以内的素数有:\n");   // 修改位置1

    for (i=2;i <= 1000;i++)
    {
        for (j = 2;j <= i/2;j++)
        {
                if (i % j == 0)
                {
                        flag = 0;
                        break;
                }
        }
        if (flag)
        {
                printf("%d\n", i);
        }
        flag = 1;  // 修改位置2
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 17:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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