Сито из Эратосфена с использованием sqrt и ceil - PullRequest
0 голосов
/ 05 мая 2018

В настоящее время я пытаюсь написать скрипт на 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.

EDIT: Нам также не разрешается жестко кодировать подобные ошибки.

Как и требовалось, вот другой скрипт, с которым я возился, но он по-прежнему не выдает ошибку при вводе нуля и не проходит тесты подтверждения

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 голосов
/ 12 мая 2018

Решается добавлением дополнительной переменной:

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

, в результате чего ввод 0 возвращает ошибку ValueError.

благодарность Salix alba за комментарий.

...