使用sqrt AND ceil

时间:2018-05-05 16:36:48

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

目前我正在尝试编写一个python脚本来模拟Eratosthenes的Sieve。问题是,教授要求我们使用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)

1 个答案:

答案 0 :(得分:1)

通过添加额外的变量:

来解决
m = int(ceil(sqrt(n-1)))

导致输入0以返回ValueError。

感谢Salix alba的评论。