题目001:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n

【思路】:学了lambda想耍一下,结果发现官网写的比我还简洁!

n =17
fenmu = range(2,n+1,2) if n%2==0 else range(1,n+1,2)
s = sum(map(lambda x:1/x,fenmu))
print(s)
# 官网参考答案
n =17
ls = sum([1/i for i in range(n,0,-2)])
print(ls)
题目002:找到年龄最大的人,并输出。

person = {"li":18,"wang":50,"zhang":20,"sun":22}  
【思路】:官网的答案也基本一样。

person = {"li":18,"wang":50,"zhang":20,"sun":22}
name,age='',0
for p in person.keys():
if person.get(p)>age:
name,age=p,person.get(p)
print(name,age)

题目003:猴子分桃

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

【思路】:不考虑解方程什么的,问题实际上归结成“整数n,迭代5次之每次都能得到整数,求n的最小值”问题。一开始想简单了,以为最后的猴子只拿一个,代进去一算发现不是整数。于是直接暴力输入,一个个试直到3121,得到整除。当然也可以反着试,假设最后一个猴子拿到n个桃子,remain = lambda t:t/4*5+1,一个个试直到1020,得到整除,也能得出结论,最开始的猴子拿了3121个桃子。

for total in range(10000):
t = total # 沙滩上有t个桃子
remain = lambda t:(t-1)/5*4 # 每次分桃后剩余桃子。
for i in range(5):
t = remain(t)
if t%1!=0:break # 如果不是整数,说明不符合题意
else:
print(total,t) # 5次都能得到整数,第一个猴子3121,五个猴子拿完沙滩剩余1020个。
break

题目004:809*??=800*??+9*?? 其中??代表的两位数,

809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。

求??代表的两位数,及809*??后的结果。

假设??为x,因为8*x<100,所以x<13。

实际上因为9*x>100,得到x>11,很明显x就是12,题意给的过于充分了。

程序如下:

l = lambda x:len(str(x))
for i in range(20):
if l(809*i)==4 and l(8*i)==2 and l(9*i)==3:
x = i
print(x)
print(809*x==800*x+9*x)
print(809*x)
题目005:求0—7所能组成的奇数个数。

【思路】:没说组成几位数或是否重复使用。假设1-8位都可以,且不能重复使用。
直接用排列函数,累加然后去重,就得到答案了。

s = [i for i in '01234567'] import itertools
arr = [] for i in range(1,9):
a = list(itertools.permutations(s,i)) # 长度1-8左右排列
l = list(map(lambda x:int(''.join(x)),a)) # 整理成数字形式(避免出现02这种情况,02实际上就是2)
arr+=l
print(i,len(l))
arr1 = set(arr) # 去重
arr2 = list(filter(lambda x:x%2==1,arr1)) # 只留奇数
print(len(arr),len(arr1),len(arr2)) # 答案是46972
def tm083_1():