题目:给定一个正整数n,计算出小于等于n的质数有多少个?比如17,则返回7,因为小于等于17的质数有2,3,5,7,13,17。
分析:
1、首先得知道什么是质数?
质数又称素数,如果一个大于1的自然数,除了1和它自身外,没法被其他自然数整除,那么这个自然数就是质数。换句话说,只有两个正因数(1和本身)的自然数即为质数。
2、那么如何判断一个数是质数呢?
思路1:判断一个整数m是否是质数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个质数。
思路2:m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ m \sqrt{m} m 之间的每一个整数去除就可以了。如果 m 不能被 2 ~ m \sqrt{m} m 间任一整数整除,m 必定是质数。原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于 m \sqrt{m} m,另一个大于或等于 m \sqrt{m} m。例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4= 16 \sqrt{16} 16,因此只需判定在 2~4 之间有无因子即可。
思路3:用空间换取时间的思想,定义一个大小为n+1的数组,都置为True,表示都为质数,然后i从2遍历到根号n,把所有i的倍数都置为False,最后统计True的个数。
对于思路3,给出Python代码如下:
def count_prime(n):
prime_array = [True] * (n+1)
i = 2
while (i * i <= n):
if (prime_array[i]):
j = i
while (i * j <= n):
prime_array[i * j] = False
j = j + 1
i = i+1
count = 0
for i in range(2,n+1):
if (prime_array[i]):
count = count + 1
print(i,end=" ")
return count