输入一个大于 2 的自然数,然后输出小于该数字的所有素数组成的列表

题目如下:

输入一个大于 2 的自然数n,然后输出小于该数字的所有素数组成的列表

        读完题目,首先我的想法是创建一个包含2—n的列表,然后从中筛选出是素数的数,将其从列表中移除即可。素数的判断简单,移除列表中的某个元素有三种常见方法,remove、pop、del

        remove删除某个符合条件的元素,按值删除

        pop和del是删除一个或多个元素,按位置删除

        那就只能remove了

        说动就动,代码如下

        蛤???为什么里面还有9、15这些非素数?当时我的第一想法是不是prime函数写错了,可是调试发现prime没错

        难道是remove出现了问题?我试着把remove换掉,改成将这个位置的值换成-1

        果然是remove的问题,机智的我。可是问题出在哪了呢?

        列表是可变的,而for循环是下标遍历,remove一次元素,该元素后面的序列将会全部变化。

        比如这道题,缩小规模输出10以内的素数列表

        首先my_list=[2,3,4,5,6,7,8,9],进入for循环

  1. i从0循环到2,发现4,remove。注意,此时整个列表长度从8变成7,但i依然从2开始

  2. i从2循环到3(不是4,列表长度发生了变化),发现6,remove。列表长度变成6

  3. i从3循环到4,发现8,remove,列表长度变成5。因为for循环从0开始,所以此时i走到了尽头,循环结束。

  4. 输出[2,3,5,7,9]

        来验证验证

        所以这种可变的序列,连续删除的方式是不可取。

        对于这道题我的想法是将所有非素数全替换成-1,将其转换成无序不能重复的集合set,这样就只存在一个-1了,此时再用remove就没有问题了。不过要记得set是无序的,最后还要用sorted排下序。

         

import math
def prime(n):
    for i in range(2,int(math.sqrt(n))+1):
        if(n%i==0):
            return 0
    else:
        return 1

num=int(input('请输入一个大于 2 的自然数:'))
my_list=list(range(2,num))
for i in my_list:
    if(prime(i)==0):
        my_list[i-2]=-1
my_list=set(my_list)
my_list=list(my_list)
my_list.remove(-1)
print(sorted(my_list))

猜你喜欢

转载自blog.csdn.net/qq_39173964/article/details/85132663