我想在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

回到顶部