鱼C论坛

 找回密码
 立即注册
查看: 2363|回复: 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; ...
想知道小甲鱼最近在做啥?请访问 -> 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,一旦执行将退出内层循环)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-14 18:47:28 From FishC Mobile | 显示全部楼层
这种问题最好是把判断一个数是否是素数单独提出一个函数来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
运行结果如下图:
ls47.png
还符合了小甲鱼得要求!!!
ls48.png
OK 希望对你有用哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

感谢大佬,大佬和楼下讲的都很有道理,原谅我把最佳答案给新鱼友啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我懂了,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

感谢大佬,这一题学会了三种方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


嗯嗯 没事,懂了就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

哇啊啊啊啊!本鱼友表示受宠若惊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 17:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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