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







