鱼C论坛

 找回密码
 立即注册
查看: 2796|回复: 9

[已解决]求10000以内的素数个数

[复制链接]
发表于 2021-4-14 18:31:35 | 显示全部楼层 |阅读模式
20鱼币
求 10000 以内的素数个数。

哪儿错了

#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,一旦执行将退出内层循环)
3]I6000D[12[}K6B[0H1.png

最佳答案

查看完整内容

第二层for语句中if语句有问题,例如数字7是素数,当j=2时,if条件成立,素数加1;当j=3时,if条件依然成立,素数会再次加1,导致一个素数加的次数可能不止一次,最后结果出错。 我们可以换个想法,在2~那个之间,如果有能被莫一整数整除,那它一定不是素数,是合数,求出合数个数后,其余的就是素数的个数啦!程序如下: #include #include int main() { int count = 2; int i, j,k; ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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,一旦执行将退出内层循环)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-4-14 18:47:28 From FishC Mobile | 显示全部楼层
这种问题最好是把判断一个数是否是素数单独提出一个函数来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-4-14 18:51:34 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5.         int count = 2;
  6.         int i, j,k;
  7.                 int flag; // 用于标记这个数是否为素数。
  8.                
  9.         for (i = 5; i < 10000; i++)
  10.         {
  11.                 k=(int)sqrt(i);
  12.                                 flag = 1; // 先假设这个数为素数
  13.                 for(j=2;j<=k;j++)
  14.                 {
  15.                          if (i % j == 0) // 不是素数
  16.                         {
  17.                                                          flag = 0;
  18.                                break;
  19.                         }
  20.                 }
  21.                                 if(flag)
  22.                                 {
  23.                                         count++;
  24.                                 }
  25.                        
  26.         }

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

  28.         return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-4-14 19:33:27 | 显示全部楼层
本帖最后由 肖-肖 于 2021-4-14 19:38 编辑
  1. for(j=2;j<=k;j++)
  2.                 {
  3.                          if (i % j != 0)
  4.                         {
  5.                                count++;
  6.                         }
  7.                                 }
复制代码

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

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

  11.         for(j=2;j<=k;j++)
  12.         {
  13.             if (i % j == 0)
  14.             {
  15.                 //count++;
  16.                 //说明不是素数了,直接跳出循环
  17.                 break;
  18.             }
  19.         }
  20.         if(j>k)
  21.             count++;
  22.     }

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

  24.     return 0;
  25. }
复制代码

运行结果如下图:
ls47.png
还符合了小甲鱼得要求!!!
ls48.png
OK 希望对你有用哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-15 01:18:08 | 显示全部楼层
肖-肖 发表于 2021-4-14 19:33
这么写不对!
比如i是9,9%2=1 ->1!=0->count+1-->不对的
我改成了如下这样:

感谢大佬,大佬和楼下讲的都很有道理,原谅我把最佳答案给新鱼友啦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

我懂了,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-15 01:32:37 | 显示全部楼层

感谢大佬,这一题学会了三种方法
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


嗯嗯 没事,懂了就好
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-4-15 16:23:48 | 显示全部楼层

哇啊啊啊啊!本鱼友表示受宠若惊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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