鱼C论坛

 找回密码
 立即注册
查看: 2247|回复: 6

[已解决]求大佬帮忙 质数问题

[复制链接]
发表于 2020-12-19 10:40:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为标准输入(stdin)的每一行给定一个正整数,需要输出不超过该整数的质数个数。当输入文本为空行时,程序必须完成。
要求:可以使用Eratosthenes’s筛算法,另外该问题中对计算速度要求较高,这意味着代码应该尽可能快地回答更大的数字情况。
也就是说代码需要能在可接受的时间内正确地回答像100000或10000000这样的大数的情况。
请将编码的主要思路记录在备注中。
下图为输入输出示例

                               
登录/注册后可看大图
最佳答案
2020-12-19 16:53:03
def get_primes(n: int) -> list:
    """
    return a list containing all prime numbers less than n.
    """
    if n <= 2:
        return []
    isprime = [True for _ in range(n)]
    result = [2]
    for i in range(3, n, 2):
        if isprime[i]:
            result.append(i)
        for j in range(0, len(result)):
            if i * result[j] >= n:
                break
            isprime[i * result[j]] = False
            if i % result[j] == 0:
                break
    return len(result)

lst=[]
n=input()
while n:
    n=int(n)
    lst.append(n)
    n=input()
for n in lst:
    print(get_primes(n))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-19 14:59:34 | 显示全部楼层
import math
def func_get_prime(n):
  return len(list(filter(lambda x: not [x%i for i in range(2, int(math.sqrt(x))+1) if x%i ==0], range(2,n+1))))
lst=[]
n=input()
while n:
    n=int(n)
    lst.append(n)
    n=input()
for n in lst:
    print(func_get_prime(n))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-19 15:14:31 | 显示全部楼层

输入为10000000时没有输出什么情况啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-19 15:36:45 | 显示全部楼层
1000
100000
10000000

168
9592
664579
>>> 
计算量大,运行时间长,一直等着就出来了
可接受的时间内,这个概念比较模糊,实际上需要的时间挺长的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-19 15:45:39 | 显示全部楼层
逃兵 发表于 2020-12-19 15:36
计算量大,运行时间长,一直等着就出来了
可接受的时间内,这个概念比较模糊,实际上需要的时间挺长的

那可以通过编程缩短这个时间吗?要求是输入越大计算时间要尽可能短。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-19 16:40:00 | 显示全部楼层
def func_get_prime(n):
    count = 3
    primenumbers = [3,5]
    x = 7
    step = 4
    while x < n:
        flag = False
        j = int(x ** 0.5)
        if x % 5 != 0:
            for i in primenumbers:
                if i > j:
                    flag = True
                    break
                if x % i == 0:
                    flag = False
                    break
            if flag:
                count += 1
                primenumbers.append(x)
        x += step
        step = 4 if step == 2 else 2

    return count

lst=[]
n=input()
while n:
    n=int(n)
    lst.append(n)
    n=input()
for n in lst:
    print(func_get_prime(n))

一分钟行不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-19 16:53:03 | 显示全部楼层    本楼为最佳答案   
def get_primes(n: int) -> list:
    """
    return a list containing all prime numbers less than n.
    """
    if n <= 2:
        return []
    isprime = [True for _ in range(n)]
    result = [2]
    for i in range(3, n, 2):
        if isprime[i]:
            result.append(i)
        for j in range(0, len(result)):
            if i * result[j] >= n:
                break
            isprime[i * result[j]] = False
            if i % result[j] == 0:
                break
    return len(result)

lst=[]
n=input()
while n:
    n=int(n)
    lst.append(n)
    n=input()
for n in lst:
    print(get_primes(n))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 01:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表