一、多分支语句
某商店出售某品牌的服装,每件定价132元,1件不打折,2件(含)到3件(含)打9折,4件(含)到9件(含)打8折,10件(含)以上打7折。请用键盘输入购买数量,屏幕输出总额(有小数时要求保留小数2位)。
price=132.0 num=int(input("请输入购买的服装数量:")) if num==1: discount=1 elif 2<=num<=3: discount=0.9 elif 4<=num<=9: discount=0.8 elif num>=10: discount=0.7 cost=price*num*discount print("购买{}件服装需要付款{:.2f}元".format(num,cost))
num=int(input(" ")):
通过input函数获取用户输入的购买数量,并将其转换为整数类型存储在变量num中。
二、判断闰年
闰年分为普通闰年和世纪闰年,普通闰年是指能被4整除但不能被100整除的年份,世纪闰年是指能被400整除的年份。请编写一个程序,允许多次输入年份并判断是否是闰年,直到‘exit’为止。
例如:输入1900,输出为1900年不是闰年;输入2004,输出为2004年是闰年;输入2000,输出为2000年是闰年;输入‘exit’,退出程序。
while True: year=input("请输入一个年份:") if year=="exit": print("程序结束") break else: year=int(year) if year%4==0 and year%100!=0 or year%400==0: print("{}年是闰年".format(year)) else: print("{}年不是闰年".format(year))
嵌套的分支语句,并使用了while循环,可以循环多次输入并判断闰年。使用break语句会提前结束本层循环。
三、猴子吃桃问题
猴子吃桃子问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天剩下的一半多一个。到第10天早上想再吃时,就只剩下一个桃子了。求第一天共摘多少个桃子?
采用逆向思维,从后往前推断,发现其中有相同的地方,即出现递推公式,可以采用递归方法。
令S10=1,容易看出S9=2(S10+1),简化一下:
S9=2S10+2
S8=2S9+2
…..
Sn=2Sn+1+2
方法一:for循环
num=1 for i in range(10,0,-1): if i==1: print("第1天摘的总桃子数是{}".format(num)) else: print("第{}天吃前还剩{}个桃子".format(i,num)) num=(num+1)*2 #前一天吃前还剩的桃子数
注意:range函数的初值到终值是一个左闭右开区间,不包含终值!
方法二:递归方法
#递归 def chitaozi(n): if n == 1: return 1 else: return (chitaozi(n-1)+1) * 2 num = chitaozi(10) print("第一天共摘了{}个桃子".format(num))
四、上/下三角形乘法表
利用循环语句和字符串格式化控制方法(format方法)分别实现上、下三角形乘法表的打印输出。
#下三角形乘法表 print("下三角形乘法表:") for i in range(1,10): for j in range(1,i+1): print("{:}*{:}={:}".format(i,j,i+j),end='\t') print() print() #上三角形乘法表 print("上三角形乘法表:") for i in range(1,10): for j in range(1,i): print('',end='\t') for k in range(i,10): print("{:}*{:}={:}".format(i,k,i*k),end='\t') print()
下三角形乘法表:对于每个 i,内层的 j 从1循环到 i ,输出 i*j 。外层的 for 循环控制i的取值范围为1~9。
上三角形乘法表:对于每个 i ,先通过一个空循环输出若干个制表符,使得每行的第 i 项能够对齐。然后内层的 k 从 i 循环到9,输出 i*k 。外层的 for 循环控制 i 的取值范围为1~9。
整个算法的时间复杂度为O(n^2),因为需要两个嵌套循环遍历九九乘法表的所有元素。但是由于n=9,所以并不会带来太大的性能问题。
五、猜数字游戏
完成猜数字游戏。每一轮游戏开始前,先询问游戏者是否开始游戏。如果游戏者给出了否定回答,则直接结束游戏。如果游戏者给出了肯定回答,则使用random库的randint方法随机产生一个1到30内的随机整数,然后提示游戏者从键盘输入一个1到30内的整数。如果游戏者输入的整数大于随机产生的整数,则程序提示猜大了;如果游戏者输入的整数小于随机产生的整数,则程序提示猜小了;如果游戏者输入的整数等于随机产生的整数,则程序提示猜中了。每一轮游戏,最多给5次猜的机会,如果猜中则需要显示经过几次猜中了,如果猜了5次还没猜中,程序提示本轮猜测失败并给出本轮正确的答案。
程序可以支持多轮游戏,并且需要统计游戏战绩。当游戏结束时,能显示出游戏战绩(共玩了多少轮,其中猜中了多少轮)。
运行结果应类似于(提示为了产生相同的运行数字,建议用random.seed(10)语句设置随机数种子)。
#猜数字游戏 import random random.seed(10) #设置随机数种子,多次运行允许出现可重复的运行结果 turn=0 #记录轮次 success=0 #记录成功次数 while True: turn+=1 begin=input("开始第{}轮猜数字游戏吗?(y/n)".format(turn)) if begin=='n': turn-=1 break num=random.randint(1,30) #产生要猜的随机数 for i in range(1,6): print("进行第{}轮第{}次尝试:".format(turn,i)) guess=int(input("请输入一个1到30范围内的正整数:")) if guess==num: print("恭喜,猜中了!本轮猜了{}次".format(i)) success+=1 break elif guess>num: print("加油,猜大了!本轮还可以猜{}次".format(5-i)) elif guess<num: print("加油,猜小了!本轮还可以猜{}次.".format(5-i)) else: print("第{}轮猜数字没有成功,本轮的正确结果{}".format(turn,num)) print("游戏结束,你的最终成绩是:猜了{}轮,猜中{}轮".format(turn,success))
random.randint(a, b):用于生成一个指定范围内的随机整数。在本例中,通过调用random.randint(1, 30)函数来随机产生一个1-30之间的数字。
for i in range(1,6)::使用for循环进行5次猜数字的机会。其中range(1,6)表示从1到5(不包含5)的整数序列。
在主程序中,通过while True:实现了无限循环,只有当用户输入'n'时才会跳出循环。同时,通过turn和success两个变量记录了游戏的轮次和成功次数,最终输出了游戏结束时的结果。