leetcode之计数质数

统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10
输出: 4 
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

质数定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。

 

解题方法:

 

一、根据质数的概念进行求解

遍历所有比n小的数,判断每个数是不是质数,进行统计

 

class Solution {
public int countPrimes(int n) {
        int res=1;//从3开始计算,所以初始为1
        if(n<3) return 0;
        else 
        {
            for(int i=3;i<n;i++)
            {
                if(i%2==0)
                    continue;
                bool flag=true;//false表示不是素数
                for(int j=3;j<=sqrt(i);j+=2)
                {
                    if(i%j==0)
                    {
                        flag=false;
                        break;
                    }
                }
                if(flag)
                {
                    res++;
                }
            }
        }
        return res;
    }
};

 

二、厄拉多塞筛法

想要得到一个不大于N的数所有素数个数,可以先找到不超过根号N的所有素数,设2 = p1 < p2 < ......<pk ≤√N,然后在2,3,4......N里面进行下面的操作:

    留下p1 = 2,把p1的倍数全部划掉,

    再留下p2 ,把p2 的倍数全部划掉,

    继续这一过程,直到留下pk,把pk的倍数全部划掉,

    最后留下来就是不超过N的全体素数。

 

例:

N = 30   ,则取pk 为5,所以2到5的所有素数为2,3,5

第一遍 留下2,划去2的所有倍数

     2   3    4   5   6   7   8   9 10

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30

第二遍 留下3,划去3的所有倍数

     2   3    4   5   6   7   8   9 10

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30

第三遍 留下5,划去5的所有倍数

   2   3    4   5   6   7   8   9 10

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30

剩余的数就是小于等于30的所有素数,即 2,3,5,7,11,13,17,19,23,29

 

代码思想:设置一个表来存放所有的小于n的数,找到第一个质数,将其在小于n的范围内的所有倍数的对应的标志位置为false,如果一个数的标志位被置为 false,则跳过次数,向下遍历,遍历完所有标志位为true的数即结束。最后所有标志位为true对应的数即为质数,true的个数就是质数的个数。

public  int countPrimes(int n) {
        vector<bool> num(n,true);
        int res=0;
        for(int i=2;i<=sqrt(n);i++)
        {
            if(num[i])
            {
                int k=2;
                while(k*i<n)
                {
                    num[k*i]=false;
                    k++;
                }
            }
        }
        for(int i=2;i<n;i++)
        {
            if(num[i])
                res++;
        }
        return res;
    }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值