Sundaram 筛子并未删除所有数字

问题描述 投票:0回答:1

我正在做一个 Python 作业,要求我编写 Sundaram 筛子的代码:

*- 从 1 到 n 的数字列表开始;

  • 对于每对整数 i 和 j,其中 1<= i <= j and i + j + 2ij <= n, remove i + j + 2ij from - the list above;
  • 最后,对于列表中剩余的每个数字 k,2k+1 都是素数。*

这是我的代码:

n = int(input())
num_lst = list(range(1, n + 1))

for i in num_lst:
    for j in num_lst:
        if (1 <= i <= j) and (i + j + (2 * i * j)) <= n:
            num_lst.remove((i + j + (2 * i * j)))
    
print(num_lst)

for idx, k in enumerate(num_lst):
    num_lst[idx] = 2 * k + 1

print(num_lst)

我看到许多使用列表推导式的解决方案,但在课程的这一点上,我们还没有涵盖它。

当输入为 50 时,我得到素数直到 101;但我也得到一些不是素数(27、45、63、99)。 我做错了什么?

python nested-loops
1个回答
0
投票

尝试过这个:

n = int(input())
num_lst = list(range(1, n + 1))
to_remove = set()

for i in num_lst:
    for j in num_lst:
        if 1 <= i <= j and i + j + 2 * i * j <= n:
            to_remove.add(i + j + 2 * i * j)

# Remove elements from num_lst after the nested loops
for num in to_remove:
    if num in num_lst:
        num_lst.remove(num)

print(num_lst)

for idx, k in enumerate(num_lst):
    num_lst[idx] = 2 * k + 1

print(num_lst)

输出:

50
[1, 2, 3, 5, 6, 8, 9, 11, 14, 15, 18, 20, 21, 23, 26, 29, 30, 33, 35, 36, 39, 41, 44, 48, 50]
[3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]
© www.soinside.com 2019 - 2024. All rights reserved.