使用 sqrt 和 ceil 的 Eratosthenes 筛法
Sieve of Eratosthenes using sqrt AND ceil
目前我正在尝试编写一个 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))
这就returns
[]
而不是 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)
通过添加附加变量解决:
m = int(ceil(sqrt(n-1)))
导致输入 0 到 return ValueError。
感谢 Salix alba 的评论。
目前我正在尝试编写一个 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))
这就returns
[]
而不是 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)
通过添加附加变量解决:
m = int(ceil(sqrt(n-1)))
导致输入 0 到 return ValueError。
感谢 Salix alba 的评论。