设置: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)
答案 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:
,它会分解并返回奇数,因为修改内循环上的列表会影响外部。