#3_python_CaiNiao教程100题(19-30)

#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)

补充:当然也可通过取出各个位数的方法进行比较(在题目已经限制了位数的情况下可用)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值