#19
#题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数
from functools import reduce
list=[]
for i in range(2,1001,1):
for j in range(1,int(pow(i,0.5))+1,1):
if i%j==0:
list.append(j)
k=i//j
if k!=i:
list.append(k)
if list:
sum=reduce(lambda x,y:x+y,list)
if sum==i:
print(i)
list.clear()
补充:
关于列表内元素的求和方式,可以自己自定义一个函数,也可以通过 reduce(lambda x,y:x+y,list)方式
#20
#题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
tour = []
height = []
hei = 100.0 # 起始高度
tim = 10 # 次数
for i in range(1, tim + 1):
# 从第二次开始,落地时的距离应该是反弹高度乘以2(弹到最高点再落下)
if i == 1:
tour.append(hei)
else:
tour.append(2 * hei)
hei /= 2
height.append(hei)
print('总高度:tour = {0}'.format(sum(tour)))
print('第10次反弹高度:height = {0}'.format(height[-1]))
补充:对列表求和也可用sum函数
#21
#题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
# 以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
x2 = 1
for day in range(9,0,-1):
x1 = (x2 + 1) * 2
x2 = x1
print (x1)
#22
#题目:题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
# 已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
for i in range(ord('x'),ord('z') + 1):
for j in range(ord('x'),ord('z') + 1):
if i != j:
for k in range(ord('x'),ord('z') + 1):
if (i != k) and (j != k):
if (i != ord('x')) and (k != ord('x')) and (k != ord('z')):
print ('order is a -- %s\t b -- %s\tc--%s' % (chr(i),chr(j),chr(k)))
补充:
ord()返回对应的 ASCII 数值,或者 Unicode 数值
#23
#题目:打印出如下图案(菱形):
# *
# ***
# *****
#*******
# *****
# ***
# *
print(
'''
*
***
*****
*******
*****
***
*''')
注:最优秀的程序员往往会以最朴实无华的方法解决最复杂的题
另:
#23
#题目:打印出如下图案(菱形):
# *
# ***
# *****
#*******
# *****
# ***
# *
list1=[3,2,1,0,1,2,3]
list2=[1,3,5,7,5,3,1]
for i in list1:
while i!=0:
print(" ",end='')
i-=1
j=list2.pop()
while j!=0:
print("*",end='')
j-=1
print()
#24
#题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
from functools import reduce
a = 2.0
b = 1.0
l = []
l.append(a / b)
for n in range(1,20):
b,a = a,a + b
l.append(a / b)
print (reduce(lambda x,y: x + y,l))
#25
#题目:求1+2!+3!+...+20!的和。
def op(x):
r = 1
for i in range(1,x + 1):
r *= i
return r
list=[]
for i in range(1,21,1):
list.append(op(i))
print(sum(list))
另
#25
#题目:求1+2!+3!+...+20!的和。
s = 0
l = range(1,21)
def op(x):
r = 1
for i in range(1,x + 1):
r *= i
return r
s = sum(map(op,l))
print ('1! + 2! + 3! + ... + 20! = %d' % s)
补充:
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
#26
#题目:利用递归方法求5!。
def fact(j):
sum = 0
if j == 0:
sum = 1
else:
sum = j * fact(j - 1)
return sum
print(fact(5))
#27
#题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
def output(s:str,l:int):
if l==len(s):
return
else:
output(s,l+1)
print(s[l],end='')
s=str(input("please input the string:"))
output(s,0)
#28
#题目:有5个人坐在一起,
# 问第五个人多少岁?他说比第4个人大2岁。
# 问第4个人岁数,他说比第3个人大2岁。
# 问第三个人,又说比第2人大两岁。
# 问第2个人,说比第一个人大两岁。
# 最后问第一个人,他说是10岁。
# 请问第五个人多大?
def age(n):
if n == 1: c = 10
else: c = age(n - 1) + 2
return c
print (age(5))
#29
#题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
x = int(input("请输入一个数:\n"))
a = x // 10000
b = x % 10000 // 1000
c = x % 1000 // 100
d = x % 100 // 10
e = x % 10
if a != 0:
print("5 位数:", e, d, c, b, a)
elif b != 0:
print("4 位数:", e, d, c, b)
elif c != 0:
print("3 位数:", e, d, c)
elif d != 0:
print("2 位数:", e, d)
else:
print("1 位数:", e)
补充:可以通过s=x% // 的方式来取得各个位数
#30
#题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
a = int(input("请输入一个数字:\n"))
x = str(a)
flag = True
for i in range(len(x) // 2):
if x[i] != x[-i - 1]:
flag = False
break
if flag:
print("%d 是一个回文数!" % a)
else:
print("%d 不是一个回文数!" % a)
补充:当然也可通过取出各个位数的方法进行比较(在题目已经限制了位数的情况下可用)