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

    剩下的都是有答案的了

  • 相关阅读:
    Redundant Paths 分离的路径(边双连通分量)
    bzoj2208 [Jsoi2010] 连通数(tarjan点双连通分量 // dfs)
    [bzoj3331] [BeiJing2013] 压力(tarjan 点双连通分量)
    [ BZOJ1123 ] BLO(tarjan点双连通分量)
    bitset小总结
    牛客328B Rabbit的工作(1)
    # Codeforces Round #529(Div.3)个人题解
    HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)
    istringstream()函数的用法
    codeforces 1077F1
  • 原文地址:https://www.cnblogs.com/SpeedZone/p/15723640.html
Copyright © 2020-2023  润新知