题解 | #质数数量#

质数数量

https://ac.nowcoder.com/acm/problem/22226

链接:https://ac.nowcoder.com/acm/problem/22226
来源:牛客网

题目描述

质数(prime number)又称素数,有无限个,质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
例如小于10的质数有2,3,5,7。
链接:https://ac.nowcoder.com/acm/problem/22226
来源:牛客网

输入描述:

第一行输入一个整数T,表示询问的个数
接下来T行每行输入一个整数n.
1<=T<=1e8,1<=n<=1000000

输出描述:

对于每个询问n输出小于等于n的的质数的个数。
输入的数太多,不能每次输入都要筛一遍质数
所以我们直接用欧拉筛选法,筛出1000000内的质数
然后统计1~1000000每个数对应的质数个数
最后只需要查表输出即可
# 欧拉筛法 True代表质数,False代表合数
num = 1000000
lis1 = [True for i in range(num + 1)]  # 记录合数
lis2 = []  # 保存质数
for i in range(2, num + 1):
    if lis1[i]:
        lis2.append(i)
    for prime in lis2:
        if i * prime > num:
            break
        lis1[i * prime] = False
        if i % prime == 0:
            break
del lis1[0]  # 因为列表里第一个代表的是0 所以我们把0删掉,现在列表的每个元素分别代表1~1000000
lis1[0] = 0  # 此时将列表里第一个元素改为0,因为此时1 对应的质数个数为零
# 然后依次对每个元素对应的质数个数进行统计
c = 0
for i in range(1, len(lis1)):  # 下标从1(第二个元素)开始,因为第一个元素我们在上面已经更改过了
    if lis1[i] == True:
        c += 1
        lis1[i] = c
    if lis1[i] == False:
        lis1[i] = c

n = int(input())
lis = []  # 把要查找的数放在列表中,方便以后查询
for i in range(n):
    lis.append(int(input()))
# 最后循环查找对应的个数
for i in lis:
    print(lis1[i-1])  # 因为下标是从0计算的,但我们这里认为第一个元素是1,所以下标要减一




全部评论

相关推荐

牛客83700679...:简历抄别人的,然后再投,有反馈就是简历不行,没反馈就是学历不行,多投多改只要技术不差机会总会有的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务