我想在Python中创建Eratosthenes的筛选器,但程序仍然返回原始输入。哪里不对?
我想在这里得到Eratosthenes的筛选,但代码不断返回原始列表。我不知道什么是错的。请帮助一个可怜的新手 - 并且非常感谢你提前!我想在Python中创建Eratosthenes的筛选器,但程序仍然返回原始输入。哪里不对?
def main(): cupcake = []
i = 0
for i in range(1, 101):
cupcake += [i]
cupcake.remove(1)
cupcake.insert(0, 0)
for j in range(len(cupcake)):
if cupcake[j] > 0:
for k in range(len(cupcake)):
if cupcake[k] > 0:
product = int(cupcake[k])/int(cupcake[j])
if (type(product) is int) == True:
if product == 1:
continue
cupcake.remove(cupcake[k])
cupcake.insert((k-1), 0)
print(cupcake)
回答:
product = int(cupcake[k])/int(cupcake[j])
在此声明product
将永远是一个浮点值,即使它是一个整数(2.0,...)。所以它后面的声明总是会返回false。你必须从
if (type(product) is int) == True:
后改变语句
if product.is_integer():
它使用float.is_integer()功能。
回答:
我不会写这样的,但在这里不用我改进建议为你的代码:
def main(): cupcake = [i for i in range(101)]
cupcake.remove(0)
cupcake.remove(1)
for j in cupcake:
if j > 0:
for k in cupcake:
if k > j and k % j == 0:
cupcake.remove(k)
print(cupcake)
main()
回答:
这就是非常低效:
- 您构建初始列表中的一个元素,在一个时间当列表理解将在一个单独的操作中执行:
cupcake = i for i in range(1, 101)
甚至cupcake = list(范围(1,101)) - 您使用反模式
remove
+insert
更改值cupcake[0] = 0
后来在代码cupcake[k] = 0
- 你从一开始为j和k中,当第二回路可以与j启动循环+ 1
- 你(错误地)使用除法时,应使用:所述列表的元素的模
而且你真正的问题是,在Python 3中,两个整数的除法始终是一个浮动一个是或不是其他的倍数:
>>> 4/2 2.0
>>> type(4/2)
float
所以,你的代码可能成为:
def main(): cupcake = list(range(1, 101))
cupcake[0] = 0
for j in range(len(cupcake)):
if cupcake[j] > 0:
for k in range(j+1, len(cupcake)):
if cupcake[k] > 0:
if cupcake[k] % cupcake[j] == 0:
cupcake[k] = 0
print(cupcake)
总之,正确的算法中是消除倍数,而不是一贯测试整除的:
def main(): cupcake = list(range(1, 101))
cupcake[0] = 0
for j in range(len(cupcake)):
if cupcake[j] > 0:
for k in range(j + cupcake[j], len(cupcake), cupcake[j]):
cupcake[k] = 0
print(cupcake)
以上是 我想在Python中创建Eratosthenes的筛选器,但程序仍然返回原始输入。哪里不对? 的全部内容, 来源链接: utcz.com/qa/262623.html