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

剩下的都是有答案的了

posted @ 2021-12-23 21:21  JS_Pierre  阅读(395)  评论(1编辑  收藏  举报