【问题标题】:Sieve of Eratosthenes using sqrt AND ceil使用 sqrt AND ceil 筛选 Eratosthenes
【发布时间】:2018-05-05 16:36:48
【问题描述】:

目前我正在尝试编写一个 python 脚本来模拟埃拉托色尼筛。问题是,教授要求我们同时使用 math.sqrt 和 math.ceil,然后运行以下测试:

assert sieve(2) == [2]
assert sieve(3) == [2, 3]
assert sieve(4) == [2, 3]
assert sieve(5) == [2, 3, 5]

try:
    sieve(0)
except ValueError:
    pass
else:
    raise AssertionError("Did not raise")

try:
    sieve(-4)
except ValueError:
    pass
else:
    raise AssertionError("Did not raise")

我只能在不使用 sqrt 或 ceil 的情况下编写脚本时使代码正常工作,但如果不使用任何一个,Try/Except 测试将无法通过,因为仅取值 0 和 -4 的平方根会抛出 ValueError ......有什么建议吗?

我目前的工作:

def sieve(n):
    myList = []
    primeList = []
    for i in range(2, n+1):
        if i not in myList:
            primeList.append(i)
            for j in range(i*i, n+1, i):
                myList.append(j)
    return primeList
print(sieve(-4))

然后返回

[]

而不是 ValueError。

编辑: 我们也不允许在这样的错误中硬编码。

根据要求,这是我一直在摆弄的另一个脚本,但它在输入零时仍然不会抛出错误,并且断言测试失败

def sieve3(n):
    marked = {}
    primes = []
    for i in range(2, int(ceil(sqrt(n)))):
        if not marked.get(i):
            for x in range(i * i, n, i):
                marked[x] = True
    for i in range(2, n):
        if not marked.get(i):
            primes.append(i)
    print(primes)

sieve3(100)

【问题讨论】:

  • 要获得 ValueError ,您似乎需要传递带有否定参数的 sqrt 。另一种选择是除以零,但这会产生 ZeroDivisionError。这似乎在代码中的某处需要类似 int(ceil(sqrt(n-1))) 之类的东西。你可能会发现 seive 在这个条件下工作,因为数字的平方永远不会是素数。
  • 谢谢 Salix,这正是我要找的。​​span>

标签: python python-3.x math sieve-of-eratosthenes


【解决方案1】:

通过添加一个附加变量来解决:

m = int(ceil(sqrt(n-1)))

导致输入 0 返回 ValueError。

感谢 Salix alba 的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多