知我枯荣 发表于 2021-4-14 18:31:35

求10000以内的素数个数

求 10000 以内的素数个数。

哪儿错了{:10_266:}

#include <stdio.h>
#include <math.h>
int main()
{
      int count = 2;
      int i, j,k;
               
      for (i = 5; i < 10000; i++)
      {
              k=(int)sqrt((double)i);
                for(j=2;j<=k;j++)
                {
                       if (i % j != 0)
                        {
                               count++;
                        }
                                }
                     
      }

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

      return 0;
}

柠檬西瓜汁 发表于 2021-4-14 18:31:36

第二层for语句中if语句有问题,例如数字7是素数,当j=2时,if条件成立,素数加1;当j=3时,if条件依然成立,素数会再次加1,导致一个素数加的次数可能不止一次,最后结果出错。
我们可以换个想法,在2~那个之间,如果有能被莫一整数整除,那它一定不是素数,是合数,求出合数个数后,其余的就是素数的个数啦!程序如下:
#include <stdio.h>
#include <math.h>
int main()
{
      int count = 2;
      int i, j,k;
               
      for (i = 5; i < 10000; i++)
      {
                k=(int)sqrt((double)i);
                for(j=2;j<=k;j++)
                {
                         if (i % j == 0)
                        {
                               count++;break;
                        }
                }
                     
      }
                count=9999-count;

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

      return 0;
}
这个程序是经过楼主的修改的,可以看到:如果i一旦能被j整除,合数加1,然后退出内层for循环,进行下一个数字的判断。(if语句中有break,一旦执行将退出内层循环)

wp231957 发表于 2021-4-14 18:47:28

这种问题最好是把判断一个数是否是素数单独提出一个函数来

ba21 发表于 2021-4-14 18:51:34

#include <stdio.h>
#include <math.h>
int main()
{
      int count = 2;
      int i, j,k;
                int flag; // 用于标记这个数是否为素数。
               
      for (i = 5; i < 10000; i++)
      {
                k=(int)sqrt(i);
                                flag = 1; // 先假设这个数为素数
                for(j=2;j<=k;j++)
                {
                         if (i % j == 0) // 不是素数
                        {
                                                       flag = 0;
                               break;
                        }
                }
                                if(flag)
                                {
                                        count++;
                                }
                     
      }

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

      return 0;
}

肖-肖 发表于 2021-4-14 19:33:27

本帖最后由 肖-肖 于 2021-4-14 19:38 编辑

for(j=2;j<=k;j++)
                {
                         if (i % j != 0)
                        {
                               count++;
                        }
                              }
这么写不对!
比如i是9,9%2=1 ->1!=0->count+1-->不对的
我改成了如下这样:
#include <stdio.h>
#include <math.h>
int main()
{
    int count = 2;
    int i,j,k;

    for (i = 5; i <= 10000; i++)
    {
      //sqrt() 用来求给定值的平方根 所以k求得是i得平方根
      k=(int)sqrt((double)i);

      for(j=2;j<=k;j++)
      {
            if (i % j == 0)
            {
                //count++;
                //说明不是素数了,直接跳出循环
                break;
            }
      }
      if(j>k)
            count++;
    }

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

    return 0;
}

运行结果如下图:

还符合了小甲鱼得要求!!!

{:10_256:} OK 希望对你有用哦

知我枯荣 发表于 2021-4-15 01:18:08

肖-肖 发表于 2021-4-14 19:33
这么写不对!
比如i是9,9%2=1 ->1!=0->count+1-->不对的
我改成了如下这样:


感谢大佬,大佬和楼下讲的都很有道理,原谅我把最佳答案给新鱼友啦{:10_297:}

知我枯荣 发表于 2021-4-15 01:21:21

柠檬西瓜汁 发表于 2021-4-14 18:31
第二层for语句中if语句有问题,例如数字7是素数,当j=2时,if条件成立,素数加1;当j=3时,if条件依然成立 ...

我懂了,感谢感谢{:10_298:}

知我枯荣 发表于 2021-4-15 01:32:37

ba21 发表于 2021-4-14 18:51


感谢大佬,这一题学会了三种方法{:10_257:}

肖-肖 发表于 2021-4-15 12:08:07

知我枯荣 发表于 2021-4-15 01:18
感谢大佬,大佬和楼下讲的都很有道理,原谅我把最佳答案给新鱼友啦

嗯嗯 没事,懂了就好

柠檬西瓜汁 发表于 2021-4-15 16:23:48

知我枯荣 发表于 2021-4-15 01:21
我懂了,感谢感谢

哇啊啊啊啊!本鱼友表示受宠若惊{:7_125:}
页: [1]
查看完整版本: 求10000以内的素数个数