通过将数字除以所有前任来操作列表

时间:2017-11-18 18:14:14

标签: python python-3.x primes

设置:python 3.6

我想创建列表并按数学规则过滤列表以查找素数。

第1部分:分配每个数字的平方根的函数

第2部分:创建列表,只需添加根%1!= 0的数字。

第3部分:问题:计算每个值是否为素数。

如何做第3部分: 取每个数字并将数字除以前任所有素数。数字是素数,只要它不是%1 == 0。 而不是进一步到列表中的下一个数字。

我真的想以这种方式去做,以便更多地了解处理列表的方法。

结果只是一个非常小的列表。

y = int(input("Please put the last number you want to now: \n"))
x = 1 #  0 is not valid by logic and 1 is not valid by definition
prims = []

# Part 1: Function: Calculate the square root (1)
def rootV(i):
    return math.sqrt(i)


# Part 2: Set the range of numbers and create the first list
for j in range(x, y):
j = int(j + 1)
c = rootV(j)

if c %1 == 0:
    continue
else:
    prims.append(j) # Liste der Wert gegeben
    print(prims)

# Part 3: Analyse every value by division with his predesessors
for i in prims:
    if len(prims) == 1:
    print("Very short list my friend: " + str(i))
    elif len(prims) > 1:
       for number in prims:
            lastNumber = len(prims) - 1
            firstNumber = 0
            value = prims[lastNumber] / prims[firstNumber]
            if value %1 == 0:
                prims.remove(lastNumber)
                continue
            else:
                continue

print(prims)

1 个答案:

答案 0 :(得分:0)

以下是我在您的代码中看到的问题:

  • 前两个步骤中的方块移除是不必要的,很好 主要发现算法无论如何都会对它们进行排序。

  • 你应该将你的除数测试限制为方数较小的除数 超过(或等于)被测试的数量。而不是反复计算 正方形,我们可以在第一步中执行一次,生成一个列表 数字和它们的正方形。

  • 您修改循环的列表是危险的。 如果我们让外循环遍历列表的副本并让它更安全 内循环仅在结束循环时才修改原始列表。

这是我的简化解决方案:

x, y = 1, 100

# Create list of numbers and their squares but numbers without an integer square root
pairs = [(j, j * j) for j in range(x + 1, y + 1)] # if (j ** 0.5) % 1 != 0]

# Calculate for each value whether its a prime number or not
for pair in list(pairs):  # walk over a *copy* of the pairs
    number, _ = pair

    # analyze every number by division with its predecessors
    for divisor, square in pairs:  # walk over the *original* pairs

        if square > number:  # finished testing
            break

        if number % divisor == 0:  # not a prime
            pairs.remove(pair)
            break

print(*(prime for prime, _ in pairs))

<强>输出

> python3 test.py
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
>

你会注意到,如果你在理解结束时放下if (j ** 0.5) % 1 != 0,允许平方通过,那么当主要测试逻辑检测到它时,结果没有区别。

您还会注意到,如果您将外循环从for pair in list(pairs):更改为简单for pair in pairs:,它会分解并返回奇数,因为修改内循环上的列表会影响外部。