PY期末习题全解析
1.判断闰年
编写程序判断输入的年是否为闰年。四年一闰;百年不闰,四百年再闰;千年不闰,四千年再闰。
选择结构的经典例题,关键在于对题目信息的整合,意识到千年和四千年的条件都是百年和四百年的子集。
a=int(input()) if a%4==0 and a%100!=0: #先描述出题目对于闰年的判断 print("Yes") elif a%400==0: #这个是特殊情况,特殊判断 print("Yes") else: #其他情况全部都不是闰年 print("No")
2.编程求解一元二次ax2+bx+c=0。
按照初中数学的方式来就行,把求根公式的过程用ifelse铺开
最大的障碍在虚根咋求忘了
import cmath import math a=int(input()) b=int(input()) c=int(input()) delta=b*b-4*a*c if delta>0: #当delta>0时 print(-b+math.sqrt(delta)/2*a) #B方减4AC系列 print(-b-math.sqrt(delta)/2*a) elif delta==0: #当delta=0时 print(-b/2*a) else: #当delta<0时 print(-b+cmath.sqrt(delta)/2*a)#求虚根 print(-b-cmath.sqrt(delta)/2*a)
3.在火车站托运行李时,规定50千克以内,每千克2元,超过部分每千克收费1.5元,编写程序,实现输入重量,输出付款金额。
比前两道题还简单的题目,描述题干即可
a=eval(input()) if a<50: print(a*2) else: print(100+(a-50)*1.5)
4.打印九九乘法表。分别写出格式一和格式二对应的Python程序。
建议配合这篇文章食用,关键在于第二层循环的含义以及控制的循环次数问题,
第一层循环进行一次,第二次循环进行一轮,像钟表一样。
for i in range(1,10): for j in range(1,i): #二层循环每一轮都比前一轮多循环一次 print(j,"*",i,"=",i*j,end=" ") #结尾的end参数控制输出的最后是个空格还是个换行 print("\n") for i in range (1,10): for j in range(1,10): if j<i: print(" ",end=" ") else: print(j,"*",i,"=",j*i,end=" ") print("\n")
5.算阶乘
先展示正常版的代码,也是循环的做法,这可以说是循环最最基础的应用了
从1循环到n即可
n=int(input()) t=1 #设置变量t用于统计,注意必须要设置成1,不能是0.变量的名字随意起 for i in range(1,n+1): #从2乘到n t*=i print(t)
不正常版就是递归的脑瘫做法,不仅慢还只能算到1000(python递归限制1000层)
def jiecheng(n): if n==1: #每个递归都要有一个退出条件,这个条件是整个递归思路的大组成部分 return 1 else: return n*jiecheng(n-1)#不难发现这里的公式基本就是循环方法的公式倒着写 n=int(input()) print(jiecheng(n))
6.斐波那契数列前20项
题干里面可以说吧递归的核心表达式直接给你了
退出条件考虑给你的那三个特殊值,递归的时候从后往前递归,总会回到那几个特殊值
def fib(n): if n==0: #条件1 return 0 elif n==1 or n==2: #条件2 return 1 else: return fib(n-1)+fib(n-2) #fib的公式逆推法 for i in range(1,21): print(fib(i))
其实这道题的递推写法结合列表是最好理解的做法,递推式和上面的递归式是一样的
顺着从低位往高位推总是好理解的
line=[0,1,1] for i in range(3,21): #第一次循环表示从第三位顺着往后推 line.append(line[i-1]+line[i-2]) #递推式 for i in line: #输出操作 print(i)
7.最大公约数
辗转相除法可以说是解决这个问题最方便最高效的方式了
用较大数对较小数取余,将所得的结果与较小数分别看做下一轮运算的较小数和较大数,再辗转相除,直到大小数相等为止。
a=int(input()) b=int(input()) maxn=max(a,b) #找最大数 minn=min(a,b) #找最小数 while minn: #当最小数不为0时 maxn,minn=minn,maxn%minn #交换加取余,都在这一步 print(maxn)
辗转相减法同理,把取余换成减法即可
当然还有个暴力法,即直接暴力枚举从2到最小值中的每一个数,找到符合定义的最大的数即可
a=int(input()) b=int(input()) maxn=max(a,b) #找最大数 minn=min(a,b) #找最小数 ans=1 for i in range(1,minn+1): if maxn%i==0 and minn%i==0: #最大公约数的定义 ans=i #记录答案 print(ans)
8.判断素数
这里的原理与上一题的暴力法一样的,先设置一个变量专门用于判断,一旦发现要判断的数字能被某个小于他的数整除就打上标记,最后在循环外判断结果,千万不能在循环进行的时候进行判断。
n=int(input()) flag=0 #判断用变量 for i in range(2,n): if n%i==0: #发现不是素数的时候 flag=1 #打上标记 if flag==0: #判断是否为素数 print("Yes") else: print("No")
9.找到水仙花数
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
————百度百科
这里给出一个简洁的解法,我们可以巧妙运用字符串的特性来解题,首先写一个100——999的循环,然后把每一个数字都转换成字符串,这样每一位都给我们自动分割好了,只需要按照题目描述把每一位用循环乘三次加起来就行了
for i in range(100,1000): n=str(i) #字符串转化 t=0 for j in n: #直接在字符串里跑循环 t+=int(j)*int(j)*int(j) #相加 if t==i: #判断是否符合定义 print(t)
10.计算自然对数
根据公式e=1+1/1!+1/2!+1/3!+...+1/n!+...,计算自然对数e,要求其误差小于0.00001.
看到题目里面的省略号的误差,就要想到这是一个用退出条件结束while死循环的思路。退出条件就是这个误差,看到公式不难想到,那个1/n!会越来越小,最后一定小于0.00001,所以这就是我们的退出条件。接下来就是按照描述一次循环一个阶乘,单独开一个变量来记录目前的循环次数
import math c=1 #记录循环次数的变量 e=1 #记录自然对数的变量 while 1: t=1 #5-7行就是正常的求阶乘 for i in range(1,c+1): t*=i e+=1/t #相加 if math.fabs(1/t)<0.00001: #退出条件 print(e) break c+=1 #别忘了循环变量加1
11.统计1、2、3、4的数字能组成互不相同且没有重复数字的三位数的数量,写出这些数及总个数。
循环嵌套的经典应用了,有几位数字就写几层循环,有几个数循环变量就是他们几个。
ans=0 #统计总数的变量 for i in range(1,5): #三层循环,变量从1-4 for j in range(1,5): for k in range(1,5): if i!=j and i!=k and j!=k: #判断 print(i*100+j*10+k) #输出单个数 ans+=1 #统计总数 print(ans) #输出总数
15 键值对遍历
主要是两个函数的使用,dic.get(i,num)的含义就是在字典所有的键里面找i,然后返回i对应的值。要是i不在字典里就给num的值。dic.item()的意思就是直接调用键值对。
dic=dict() #创建字典 b=["dsfsdfsd","sdfsfsdf","sdgfsdfgsffgdf","sdfgfsdgt4wergfsdf","dsgsgersgdsfgesr"] for i in b: dic[i]=dic.get(i,0)+1 #把单词怼进字典 for i,j in dic.items(): #遍历 print(i," ",j)
16.删除重复单词
代码最短的一道题,但是一行浓缩了三步。先把字符串用split()分隔开,然后把单个单词怼进list,再把list怼进set去去重,最后排个序就行了
x=input() print(sorted(set(list(x.split()))))
18.模拟银行账户
支持 存钱、取钱 和 显示余额 操作。
就是类的简单应用,没啥逻辑
class account: def __init__(self,name): #类初始化 self.name=name self.mon=0 def dm(self,money): #存钱 self.mon+=money def wm(self,money): #取钱 self.mon-=money if self.mon<0: self.mon=0 def sb(self): #展示余额 print(self.mon) a=account("aaaaa") a.dm(114514) #哼哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 a.sb() a.wm(23333) a.sb()
剩下的都是有答案的了