【问题标题】:codeforces timelimit (230B T-primes) python3.6codeforces时间限制(230B T-primes)python3.6
【发布时间】:2018-09-06 14:32:55
【问题描述】:

我的代码有问题,我使用eratosthenes这个函数来创建一个列表,我只是制作了一个大内存大小列表(1000000),在主要我输入codeforces input()并让他们sqrt( ),所以,我不知道为什么我的代码时间限制超过 2000 毫秒,请帮我解决这个问题。

import math

def eratosthenes(n):  # creative the prime list
    IsPrime = [True] * (n + 1)
    IsPrime[1] = False
    for i in range(2, int(n ** 0.5) + 1):
        if IsPrime[i]:
            for j in range(i * i, n + 1, i):
                IsPrime[j] = False
    return [x for x in range(2, n + 1) if IsPrime[x]]

#  main code
input()
li = list(map(int, input().split()))
nl = eratosthenes(1000000)
for i in li:
    i = math.sqrt(i)
    if int(i) == i:
        print("YES" if i in nl else "NO")
    else:
        print("NO")

当我引用别人的代码时,我认为我的代码的运行时间与其他代码相似,否则我错了。

【问题讨论】:

  • 为什么return [x for x in range(2, n + 1) if IsPrime[x]] 是缩进的?这会在第一个数字之后返回吗?这应该在 for 循环之外吗?
  • 你如何满足输入()?这只是在等待用户输入数字,还是在 stdin 上提供输入?
  • 你的第一个 munber 是 0 还是 2 ?它返回就像 [2, 3, 5, 7, 11.....]
  • 我在 codeforces 上做,他们会给我一些 input() link
  • 很难说你的实际代码是什么样子的,因为缩进在问题中被破坏了。你能纠正一下吗?我看到两个不必要的工作实例:从IsPrime 创建列表,然后在该列表中进行线性搜索。为了测试一个数字是否为素数,IsPrime 列表本身已经可以使用了。

标签: python sieve-of-eratosthenes time-limiting


【解决方案1】:

我认为你的eratosthenes功能还可以,主要瓶颈是你在回答问题时......

print("YES" if i in nl else "NO")

在这部分中,您在 nl 列表中搜索,这是 O(p),其中 p 是 nl 中素数的数量。 小于 N 的素数的数量是 O(N/logN),特别是这里大约 78500 个数字。

因此,如果输入包含一些大正方形,但不是 T 素数,您的代码将执行大约 10^5 * 78500 ~= 8*10^9 操作,这会产生 TimeLimitError。

您可以使用 IsPrime 数组来检查数字是否为素数。

除了这个加快速度,我不知道python sqrt有多快,但是你可以用二分法计算sqrt,看看是否更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多