【代码超详解】HDU 2138 How many prime numbers? 有多少个质数?(质数埃筛打表 + 判定,31 ms)

博客详细介绍了如何使用埃拉托斯特尼筛法找到一定范围内的质数,并提供了质数判定的算法分析。通过示例输入输出解释了问题的要求,并给出了AC代码,该代码在HDU 2138题目的比赛中运行时间为31 ms。
摘要由CSDN通过智能技术生成

一、题目描述

How many prime numbers

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 27558 Accepted Submission(s): 9246(2019/11/11)

Problem Description

Give you a lot of positive integers, just to find out how many prime numbers there are.
给一堆正整数,找出其中有多少个质数。

Input

There are a lot of cases. In each case, there is an integer N representing the number of integers to find. Each integer won’t exceed 32-bit signed integer, and each of them won’t be less than 2.
有很多样例。每个样例中,有N个整数要判定。每个整数不超过32位有符号整数的范围,且不小于2。

Output

For each case, print the number of prime numbers you have found out.
对每个样例,输出所含质数的个数。

Sample Input

3
2 3 4

Sample Output

2

Author

wangye

Source

HDU 2007-11 Programming Contest_WarmUp

Recommend

威士忌 | We have carefully selected several similar problems for you: 2136 1431 2132 2139 2134

二、算法分析说明与代码编写指导

质数的埃氏筛法

1、用途:快速选出一定数量的质数。
2、算法内容:
埃拉托斯特尼(Eratosthenes)筛法(埃氏筛法) 要筛选出不大于n的质数,排除sqrt(n)以内全部质数的倍数即可。
(Eratosthenes(前276—前194),古希腊数学家)
设需要生成前若干个质数,prime数组用于存储已经验证为质数的数。
设a为当前正在验证是否为质数的正整数,t = sqrt(a)为需要试除的范围。
用已知的质数去除a,如果能整除,a就有除了1和a本身以外的因数,终止当前的判断,准备判断a+1。
为什么只用试除到t = sqrt(a)呢,因为因数是一对一对的,例如:
100 的因数有:1 2 4 5 10 20 25 50 100。我们发现,1 * 100 = 2 * 50 = 4 * 25 = 5 * 20 = 10 * 10。
如果验证到sqrt(a)后,还没有发现第3个a的因数,自然也不会再有了。
换句话说,还是以100为例子,如果找出了因数2,就可以计算出因数50。如果找到了因数4,就可以计算出因数25。
如果验证了某个数d不是a的因子,那么d的倍数也不是a的因子。
比如2不是 a 的因子,那么4 6 8 …… 都不用验证了。比如3不是 a 的因子,那么6 9 12 …… 都不用验证了。
如果要验证是否为a的因子的数d是质数,那么在之前验证过的数及其倍数都不是这个质数d的因数,也就是说d还没有用于验证过。
可见,用质数试除是不能避免的。对于合数来说,如果已知它的一个质因数不是a的因子,那么这个合数也不用再验证是否为a的因子。意即,要用这个合数去除a,就相当于用a的每个质因数去除a。如果某个质因数不能整除a,那么这个合数也不能整除a。
从几个角度都啰嗦完了,相信总有一种角度适合你的理解。

质数的判定

1、用途:迅速判定一个数是否为质数。
2、算法内容:
用埃氏筛法打质数表,打表结果保存在prime数组中。然后判断要验证是否为质数的整数x是否在表的范围内。如果是,在prime数组内二分搜索x,搜到就是质数,搜不到就不是。如果x超出了表的范围,就验证x是不是已经打表的质数的倍数。如果都不是,x就是质数。

3、代码实现:(含埃氏筛法打表,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值