这一期内容可以结合着与第一期一起看https://guidm.blog.csdn.net/article/details/130900129?spm=1001.2014.3001.5502
让我们来先做个题目:
1、输入一个整数n,要求输出[1,n]范围内的所有完数。
完数是一个正整数,该数恰好等于其所有不同真因子之和。
a = [6, 28, 496, 8128]
try:
while True:
cnt = 0
n = int(input())
print(n, end=':')
for i in a:
if i <= n:
cnt += 1
print('',i,end='' )
else:
break
if cnt == 0:
print('NULL')
else:
print()
except EOFError:
pass
一维列表
1、基本概念
一维列表的定义:列表名 = [列表值表]
列表名应是合法的用户标识符,列表值表可以为空,也可以有一个或多个元素,各个元素之间用逗号隔开。可以通过下标访问列表中的各个元素,下表从0开始。
一些列表的用法:
a = []
b = [1]
c = [1, 2, 3, 4, 5]
d = [0]*5 复制五个0创建列表
e = [1, 2, 3] + [4, 5, 6]#用+ 合并两个列表成为一个新的列表
可以用内置函数list( )创建空列表,列表的长度可以用内置函数len( )求得。
内置函数sorted(可迭代对象,key,reverse)
排序的时候按照关键字key对应函数的返回值进行排序,key的默认值为None,表示升序排序;逆序标记reverse默认为False,表示不进行逆序处理,若指定reverse为True,则将对排序结果逆序处理。
sorted()与列表名.sort不同之处在于前者不会改变列表,后者会改变列表。
2、一维列表的应用
2.1 逆序输出
输出若干个整数,然后按输入的相反顺序显示这些数据。
方案一:第一个数据除外,输出每个数据之前,先输出一个空格。
方案二:最后一个数据除外,输出每个数据之后,再输出一个空格。
#方案一:
a = list(map(int, input().split()))
n = len(a)
for i in range(n-1, -1, -1):
if i != n-1:
print('', end = ' ')
print(a[i], end='')
print()
#方案二:
a = list(map(int, input().split()))
n = len(a)
cnt = 0
for i in range(n-1, -1, -1):
cnt += 1
if cnt > 1:
print('', end='')
print(a[i], end='')
print()
实际上,可以直接使用reverse进行逆置列表,如果要求数据之前间隔一个空格,则可以直接在这些可迭代对象之前加一个*,作为内置函数print()的参数数据进行输出。
a = list(map(int, input().split()))
a.reverse()
print(*a)
把*a作为print()函数的参数实际上是吧列表a中的各个元素逐个取出作为print()函数的参数。
2.2数位分离
输入一个整数n,要求输出其位数,并分别以正序和逆序输出各位数字。每两个数据之间用一个逗号分隔。
n = int(input())
a = [0]*10
i = 0
while n > 0:
a[i] = n % 10
n = n // 10
i += 1
print(i, end='')
for j in range(i-1, -1, -1):
print(',', a[j], sep='', end='')
for j in range(i):
print(',', end='')
print(a[j], end='')
print()
解读:把n中的各个数位上的数字分离出来,可以不断使用取余运算符%取得个位并存放在列表中,并用n=n//10去掉个位,直到n为0为止。
2.3约瑟夫环
有n个人围成一圈,从第1号开始进行1、2、3报数,凡报3者就退出,下一个又从1开始报数……知道最后只剩下一个人时为止。输入整数n,请问最后剩下者原来的位置是多少号。
n = int(input())
a = [True]*n #定义长度为n的逻辑型列表,所有元素为True
j = -1 #下标变量j赋初值
cnt = 0 #报数计数器赋初值
m = n #剩余人数计数器赋初值
while m>1:
j = (j+1)%n
if a[j] == False:
continue
cnt += 1
if cnt %3 == 0:
a[j] = False
m -= 1
for i in range(n):
if a[i] == True:
print(i + 1)
break
解读:开始时把一个逻辑型列表的所有元素的值都设为True表示相应的人在圈中,当剩余人数多余1人时,用下标j逐个扫描列表元素,检查当前下表对应的人是否已出圈,若已出圈则跳过,否则计数器cnt增加一,若计数器是三的倍数,则相应的人出圈,设为False。
2.4循环移位
在一行上先输入两位数n和m再接着输入n个整数构成一个数列,要求把前m个数循环移位到数列的右边。
a = list(map(int, input().split()))
n = a[0]
m = a[1]
a = a[2:]
for i in range(m):
x = a[0]
for j in range(1,n):
a[j-1] = a[j]
a[n-1] = x
print(*a)
2.5 小者靠前
第一行输入整数n,第二行输入n个整数到一个列表中,使得其中最小的一个数成为列表的第一个元素(首元素)。若有多个最小数,则首元素仅与最早出现的最小的数交换。
n = int(input())
a = list(map(int, input().split()))
k = 0
for i in range(1, n):
if a[i]<a[k]:
k = i
a[0],a[k] = a[k],a[0]
print(*a)
2.6 选择排序
第一行输入数据个数n,第二行输入n个整数构成整数数列,要求对该整数进行排序,使其升序排列。
n = int(input())
a = list(map(int, input().split()))
for i in range(0, n-1):
k = i
for j in range(i+1, n):
if a[k] > a[j]:
k = j
if k!=i:
a[i], a[k] = a[k], a[i]
print(*a)
对于n个数升序排列,共进行n-1趟排序,每一趟从待排序的数列中选出最小的一个数,通过交换操作放到当前的最前位置。
2.7冒泡排序
第一行输入数据个数n,第二行输入n个整数构成整数序列,要求对该整数进行排序,使其升序排列。、
n = int(input())
a = list(map(int, input().split()))
for i in range(0, n-1):
for j in range(n-1-i):
if a[j]>a[j+1]:
a[j],a[j+1] = a[j+1],a[j]
print(*a)
对n个数升序排列,共进行n-1趟排序,每一趟依次比较相邻的两个数,若位置逆序则交换,将小者放在前面,大者而放在后面,每一趟排序结束时,把当前的最大数放到当前的最后位置。