经典案例题2
1.题目:求1+2!+3!+...+20!的和。
sum = 0 t = 1 for i in range(1,21): t *= i sum += t print(sum)
2.题目:利用递归方法求5!。
def jiecheng(n): # print(n) if n == 0: sum = 1 else: sum = n * jiecheng(n-1) # print(sum) return sum result = jiecheng(5) print(result)
3.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
# 一 def reversal(abc,lens): if lens <= 0: return else: print(abc[lens-1]) reversal(abc,lens-1) abc = input('请输入一段字符:') lens = len(abc) reversal(abc,lens) # 二 def func(abc): if (len(abc) > 0): print(abc[-1]) func(abc[:-1]) abc = input('asdfsa') func(abc)
4.有5个人坐在一起,
问第五个人多少岁?他说比第4个人大2岁。
问第4个人岁数,他说比第3个人大2岁。
问第三个人,又说比第2人大两岁。
问第2个人,说比第一个人大两岁。
最后问第一个人,他说是10岁。
请问第五个人多大?
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
#一 def func(x): if x == 1: age = 10 else: age = func(x-1) + 2 return age print(func(5)) #二 def func(x): for i in range(4): x += 2 return x print(func(10))
5.题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
# 一 num = input('请输入一个正整数:') lens = len(num) num = str(num) for i in range(lens): print(num[lens-i-1]) # 二 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)
6.题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
# 一 def huiNum(num): if len(num) == 5: if b[0] == b[-1] and b[1] == b[-2]: print('%s是个回文数' % b) else: print('%s不是回文数' % b) else: print('请输入一个五位数') b = input('请输入一个五位数:') huiNum(b) #二 def huiNum(c): # 将输入的值反转顺序 b = c[::-1] if c == b: print('%s是个回文数'%c) else: print('%s不是个回文数'%c) c = input('请输入一个数字:') huiNum(c)
7.题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
# week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'] def main(value): if value not in weeks: print('输入格式不正确') elif value in ['T','S']: aa = input('请输入第二个字母:') print(weeks[value][aa]) else: print(weeks[value]) if __name__ == '__main__': weeks = {'M': 'Monday', 'T': {'u': 'Tuesday', 'h': 'Thursday'}, 'W': 'Webnesday', 'F': 'Friday', 'S': {'t': 'Staturday', 'u': 'Sunday'}} value = input('请输入第一个字母:') value = value.upper() main(value)
8.输出1到100的素数 质数
# 一 for i in range(2,100): for m in range(2,i): if i % m == 0: break else: print(i) # 二 lower = int(input("输入区间最小值: ")) upper = int(input("输入区间最大值: ")) for num in range(lower, upper + 1): # 素数大于 1 if num > 1: for i in range(2, num): if (num % i) == 0: break else: print(num)
9.题目:求一个3 * 3矩阵主对角线元素之和。
程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
a = [] sum = 0.0 for i in range(3): a.append([]) for j in range(3): a[i].append(float(input("input num:\n"))) for i in range(3): sum += a[i][i] print(sum)
10.题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
# 一 oldList = [1,3,5,6,8,21,34] newNum = int(input('请输入一个数字:')) for i in oldList: if newNum > i: oldList.append(newNum) break elif i >= newNum: index = oldList.index(i) oldList.insert(index,newNum) break print(oldList) # 二 oldList = [1,2,5,8,10] newNum = int(input('请输入一个数字:')) oldList.append(newNum) res = sorted(oldList) #相当于oldLost.sort() 这个没有返回值 print(res)
11.两个 3 行 3 列的矩阵,实现其对应位置的数据相加,并返回一个新矩阵:
X = [[12, 7, 3], [4, 5, 6], [7, 8, 9]] Y = [[5, 8, 1], [6, 7, 3], [4, 5, 9]] for i in range(3): for v in range(3): X[i][v] += Y[i][v] print(X)
12.统计 1 到 100 之和。
sum = 0 for i in range(1,101): sum += i print(sum) # 或者 print(sum(range(1,101)))
13.求输入数字的平方,如果平方运算后小于 50 则退出。
import time while True: num = int(input('请输入一个数字:')) numSqire = num ** 2 if numSqire < 50: print('您输入的数字的平方小于50,即将退出程序') time.sleep(1) break else: print('您输入数字的平方为:%d'%numSqire)
14.输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
alist = [1,4,52,4,8,5] maxva =alist.index(max(alist)) minva = alist.index(min(alist)) alist[maxva],alist[minva] =alist[minva],alist[maxva] # print(alist)
15. 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
from collections import deque # 一 m = 3 b = [1,2,3,4,5,6,7] # 7 个数 f = deque(b) #将指定列表放入deque中,返回一个实例对象 f.rotate(m) #将b向左旋转m的数字,若为负数则向右旋转 print(list(f)) # 二 m = 3 b = [1,2,3,4,5,6,7] after_num = b[0:m] aa = list(set(b) ^ set(after_num)) b = aa + after_num print(after_num,b) # 三 def rotine_list(lista,n): after_num = lista[0:n] aa = list(set(after_num) ^ set(lista)) lista = aa + after_num print(lista) lista = [] for i in range(5): num = int(input('请输入一个数字:')) lista.append(num) n = int(input('请输入移动位数:')) if n < len(lista): rotine_list(lista,n) else: print('移动位数超出范围')
16.题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
from collections import deque #添加进列表 a=[] n=input('请输入几个人:') for i in range(1,int(n)+1): a.append(i) b=deque(a) # 使用双段队列deque,目的是使用里面的方法回转rotate #创建删除符合3的数并且回转列表 while True: b.remove(b[2]) #删除为3的数也就是索引为2的数 b.rotate(-2) #将第三个数后面的数进行回转从头开始 if len(b)==2: print(b[1]) #最后剩两个数,那么最后的人一定是最后一个数 break
17.题目:编写input()和output()函数输入,输出5个学生的数据记录。
outer_list = [] def input_student(): for i in range(1,3): inner_list = [] name = input('请输入第%d学生情况\n姓名:'%i) sex = input('请输入性别:') grade = input('请分别的输入语文数学英语成绩,并以逗号分开:') grade = grade.split(',') inner_list.append(name) inner_list.append(sex) inner_list.append(grade) outer_list.append(inner_list) print(outer_list) def output_student(name): if name not in outer_list: return '无此学生匹配信息' for stu in outer_list: if stu[0] == name: print('姓名:%s'%stu[0]) print('性别:%s'%stu[1]) print('语文:%s\n数学:%s\n英语:%s\n查询完成'%(stu[-1][0],stu[-1][1],stu[-1][2])) if __name__ == "__main__": input_student() n = input('是否要继续,输入q,退出\n') if n != 'q': name = input('请输入要查询的学生姓名:') output_student(name)
18.编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
def funcnum(num): sum = 0 if int(num) % 2 == 0: for i in range(2,int(num)+1,2): # print(i) sum += 1 / i else: for i in range(1,int(num)+1,2): sum += 1 / i print(sum) if __name__ == '__main__': num = input('请输入一个整数:') funcnum(num)
19.题目:809*??=800*??+9*?? 其中??代表的两位数, 809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果
for i in range(10,100): if i > 10 and 809 * i > 1000 and 8 * i > 10 and 9 * i > 100: if 809 * i == 800 * i + 9 * i: print(i)
20. 题目:输入一个奇数,然后判断最少几个 9 除于该数的结果为整数。
num = 13 sum = 9 while sum % num != 0: sum = sum * 10 +9 print(sum)
21. 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后
用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
def encry(num): numstr = '' for i in num: i = (int(i) + 5) % 10 numstr += str(i) newnum = numstr[::-1] print(int(newnum)) if __name__ == "__main__": num = input('请输入四位的一个整数') encry(num)
22.题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,
又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
猴子分桃,最少问题分析:问最少有多少只桃子,则岸上最后剩的桃子数目越小,则原岸上的桃子越少
假设最后岸上还剩4x只桃子,可以利用递归方法求解
num=int(input("输入猴子的数目:")) def fn(n): if n==num: return(4*x) #最后剩的桃子的数目 else: return(fn(n+1)*5/4+1) x=1 while 1: count=0 for i in range(1,num): if fn(i)%4==0 : count=count+1 if count==num-1: print("海滩上原来最少有%d个桃子" % int(fn(0))) break else: x=x+1
23.题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
# 一 from collections import deque #添加进列表 a=[] n=input('请输入几个人:') for i in range(1,n+1): a.append(i) b=deque(a) # 使用双段队列deque,目的是使用里面的方法回转rotate #创建删除符合3的数并且回转列表 while True: b.remove(b[2]) #删除为3的数也就是索引为2的数 b.rotate(-2) #将第三个数后面的数进行回转从头开始 if len(b)==2: print b[1] #最后剩两个数,那么最后的人一定是最后一个数 break # 二 data = [i+1 for i in range(20)] print(data) i = 1 while len(data) > 1: if i % 3 == 0: data.pop(0) else: data.insert(len(data),data.pop(0)) i += 1 print(data)