首页 > 试题广场 >

返回小于 N 的质数个数

[编程题]返回小于 N 的质数个数
  • 热度指数:4576 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
请考虑性能

输入描述:
一个整数N


输出描述:
小于N的质数数量
示例1

输入

10

输出

4

说明

N=10,质数有 [2, 3, 5, 7]

备注:
0、1 不属于质数。
while True:
    try:
        n=int(input().strip())
        num=0
        def iszhishu(i):
            num=i//2
            result=True
            if num==0:
                result= False
            else:
                for j in range(1,num+1):
                    if j!=1 and i%j==0:
                        result= False
            return result
        if n<=1:
            print(0)
        else:
            for i in range(2,n):
                #print(i)
                if iszhishu(i):
                    #print(i)
                    num+=1
            print(num)


    except:
        break
编辑于 2019-07-27 13:36:43 回复(0)

python解法

使用 普通筛选法--埃拉托斯特尼筛法
先简单说一下原理:
基本思想:素数的倍数一定不是素数
实现方法:用一个长度为N+1的数组保存信息(0表示素数,1表示非素数),先假设所有的数都是素数(初始化为0),从第一个素数2开始,把2的倍数都标记为非素数(置为1),一直到大于N;然后进行下一趟,找到2后面的下一个素数3,进行同样的处理,直到最后,数组中依然为0的数即为素数。
如果n*n > 范围最大值就跳出。

import math
def countPrime(N):
    n = int(math.sqrt(N) + 1)
    arr = [True] * (N+1)
    for i in range(2, n):
        for j in range(2, N):
            if i * j <= N:
                arr[i * j] = False
            else:
                break
    return sum(arr) - 2
print(countPrime(int(input())))
编辑于 2019-03-19 22:48:53 回复(0)