【问题标题】:I am having a problem with my code on Sieve of Eratosthenes我在 Eratosthenes 筛上的代码有问题
【发布时间】:2020-07-11 23:12:47
【问题描述】:

请参阅下面的代码。我不断收到错误代码,我也不明白它的含义。我可以在哪里查看代码?

def list_true(n):
    return [False for x in range(2)] + [x for x in range (2, n+1)]

assert len(list_true(20)) == 21
assert list_true(20)[0] is False
assert list_true(20)[1] is False


def mark_false(bool_list, p):
    mark_false = []
    for x in bool_list:
        if x/p == 1:
            mark_false.append(True)
        elif x % p == 0:
            mark_false.append(False)
        else:
            mark_false.append(True)
    return mark_false

assert mark_false(list_true(6), 2) == [False, False, True, True, False, True, False]

def find_next(bool_list, p):
    x = 0
    cleared = False
    for bool in bool_list:
        if cleared:
            if bool:
                return x
        if x == p and bool:
            cleared = True
        x += 1
    return None

assert find_next([True, True, True, True], 2) == 3
assert find_next([True, True, True, False], 2) is None

def prime_from_list(bool_list):
    y = [x for x, i in enumerate(bool_list) if i]
    prime_from_list = []
    for element in bool_list:
        if element == True:
            return y
    return prime_from_list

assert prime_from_list([False, False, True, True, False]) ==  [2, 3]

def sieve(n):
    bool_list = list_true(n)
    p = 2
    while p is not None:
        bool_list = mark_false(bool_list, p)
        p = find_next(bool_list, p)
    return prime_from_list(bool_list)

然后我在下面的代码之后收到一条错误消息。

assert sieve(1000) == get_primes(0, 1000)
--------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-50-c49169fabbae> in <module>()
----> 1 assert sieve(1000) == get_primes(0, 1000)

AssertionError: 

为什么我会收到错误消息,有什么方法可以修改它?

【问题讨论】:

  • 您的断言不起作用。如果一个断言不能正确断言,那么你就会得到那个错误。你也很模糊。请不要在这里含糊其辞,人会欺负你
  • sieve(1000) 不等于 get_primes(0,1000),这是什么意思...也许检查一些较小的值,如 print(sieve(5),"==",get_primes(0,5))

标签: python primes sieve-of-eratosthenes


【解决方案1】:

这是一个奇怪的问题。首先,您没有提供get_primes(0, 1000),所以我们无法比较结果。其次,作为程序员,您输入assert 语句来测试您知道不应该发生的情况,因此您不应该质疑assert 本身。

我相信assert 失败的原因是您的受折磨的代码不会产生素数(它包括复合奇数)。 sieve(20) 返回:

[2, 3, 5, 7, 9, 11, 13, 15, 17, 19]

此外,您的代码实际上并不是一个筛子! mark_false() 例程应该简单地剔除最近发现的素数的倍数,但它会测试 所有 数字以查看它们是否可以被素数整除!这是蛮力伪装成筛子的素数搜索。

以下是我对您的代码的返工和简化,它应该通过相关的断言:

def list_true(n):
    return [False for _ in range(2)] + [True for _ in range(2, n + 1)]

assert len(list_true(20)) == 21
assert list_true(20)[0] is False
assert list_true(20)[19] is True

def mark_false(bool_list, prime):

    for index in range(prime * prime, len(bool_list), prime):
        if bool_list[index] is False:
            continue

        bool_list[index] = False

    return bool_list

assert mark_false(list_true(6), 2) == [False, False, True, True, False, True, False]

def find_next(bool_list, index):
    while index + 1 < len(bool_list):
        index += 1

        if bool_list[index]:
            return index

    return None

assert find_next([True, True, True, True], 2) == 3
assert find_next([True, True, True, False], 2) is None

def prime_from_list(bool_list):
    return [index for index, boolean in enumerate(bool_list) if boolean]

assert prime_from_list([False, False, True, True, False]) == [2, 3]

def sieve(number):
    bool_list = list_true(number)
    prime = 2

    while prime is not None:
        bool_list = mark_false(bool_list, prime)
        prime = find_next(bool_list, prime)

    return prime_from_list(bool_list)

assert sieve(1000) == get_primes(0, 1000)

注意bool是一个Python类,不要用它作为变量名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多