Leng_Mo 发表于 2021-8-26 22:13:45

寻找1000以内的素数

#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-26 22:54:27

_Bool 不是函数,是关键字,是变量的类型
vs 不支持 _Bool,把 _Bool 改成 int 试试

jackz007 发表于 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   97101103107109113
127131137139149151157163167173
179181191193197199211223227229
233239241251257263269271277281
283293307311313317331337347349
353359367373379383389397401409
419421431433439443449457461463
467479487491499503509521523541
547557563569571577587593599601
607613617619631641643647653659
661673677683691701709719727733
739743751757761769773787797809
811821823827829839853857859863
877881883887907911919929937941
947953967971977983991997

D:\00.Excise\C>

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

kogawananari 发表于 2021-8-26 23:24:44

#include <stdbool.h>用 bool试试

YaoShi 发表于 2021-8-26 23:36:24

YaoShi 发表于 2021-8-26 23:15
就这道题而言 flag只要用到1和0两个值int直接用

我搜了一下标准c没有布尔类型c++有
另外布尔值没什么特殊的   0和1而已

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

jhq999 发表于 2021-8-27 06:44:37

YaoShi 发表于 2021-8-26 23:36
我搜了一下标准c没有布尔类型c++有
另外布尔值没什么特殊的   0和1而已

是0和其他

超过光速c 发表于 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;
}
页: [1]
查看完整版本: 寻找1000以内的素数