python 习题练习三


前言

“带上你的千军万马!虽然终不免孤身奋战!”


1、阶乘和数

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。


import math

n = input()
s=sum(math.factorial(int(i)) for i in n)#这里使用推导式
if int(n) == s:
    print('YES')
else:
    print('NO')

这里就感觉python的函数和推导式好用哈

2、计算圆周率

在这里插入图片描述

k=eval(input())
p=0
f=1
l=0
while pow(2*l+1,-1)>=k:
    p=p+pow(2*l+1,-1)*f
    f=-f
    l=l+1
print("{:.6f}".format(p*4))

3、求e的近似值B

在这里插入图片描述

import math
n=eval(input())
p=0
l=1
while pow(math.factorial(l),-1)>=n:
    p=p+pow(math.factorial(l),-1)
    l=l+1
print("{:.8f}".format(p+1))

这两道都是流程控制的题,看到阈值就大概有了了解,就是通过一个类似阈值的形式控制你的计算结果。

4、二分法求函数的零点

在这里插入图片描述

def f(x):
    return x ** 5 - 15 * x ** 4 + 85 * x ** 3 - 225 * x ** 2 + 274 * x - 121


def bisection_method(low, high):
    while True:
        mid = (low + high) / 2
        if abs(f(mid)) < 1 * 10 ** -n:
            return '{:.6f}'.format(mid)
        elif f(mid) < 0:
            high = mid
        else:
            low = mid


if __name__ == '__main__':
    n = int(input())
    Low, High = 1.5, 2.4
    print(bisection_method(Low, High))

这里二分法找零点,我们需要写两个函数,一个用来计算函数的值,一个用来判断,并且使用二分法递归。

5、计算函数曲线与x轴包围的面积

在这里插入图片描述

import math

a, b = map(float, input().split())  # 输入区间起点和终点
n = int(input())                    # 输入区间切分数量
area = 0                            # 面积初值
x = a                               # 设定起点x值
dx = abs(a - b) / n                 # 计算每个小区间的高度,即每个小梯形的高度
for i in range(n):                  # 遍历n个区间,计算每个小梯形面积并累加到一起
	area = area + dx * (abs(math.sin(x + i * dx)) + abs(math.sin(x + i * dx + dx))) / 2
print("{:.2f}".format(area))        # 输出面积值

这里的dx=abd(a=b)/n,然后在循环中叠加面积,但是他每个小长方形的高是左边端点和右边端点的和的二分之一,这搞清楚就可以计算每个小长方形的面积,然后汇总求和,保留小数位输出就可以了。

6、与7无关的数

在这里插入图片描述

n=eval(input())
ls=[]
sum=0
for i in range(1,n):
    if i%7!=0 and '7' not in str(i):
        ls.append(i)
        sum=sum+pow(i,2)
print(ls)
print(sum)
        

用到列表元素的添加,ls.append(i),将i元素加入到列表中,之后判断7在不在这个数字的十进制的某位,我们可以用str()函数把i转为字符串类型,然后用 not in 判断7是否在i中。

7、百钱买百鸡B

在这里插入图片描述

num, money = map(int, (input().split()))
flag = 0
for x in range(1, money // 5 + 1):
    for y in range(1, money // 3 + 1):
        z = num - x - y  # 鸡雏的数量等于总数减鸡翁和鸡母的数量
        if z % 3 == 0 and z > 0 and 5 * x + 3 * y + z // 3 == money:
            print(x, y, z)
            flag = 1  # 如果找到满足的解那么flag从0变为1
# 如果找不到满足的解则输出无解
if flag == 0:
    print('无解')

这道题之前做过,但这个代码做了一点优化,省去了不必要的循环次数。

8、老鼠打洞

在这里插入图片描述

n = int(input())
rat, mouse, day, time = 1, 1, 0, 1
distance_of_rat, distance_of_mouse = 0, 0  # 大老鼠和小老鼠的打洞距离
while n > 0:
    if n - mouse - rat < 0:
        time = n / (mouse + rat)
    n = n - mouse - rat
    distance_of_mouse = distance_of_mouse + time * mouse
    distance_of_rat = distance_of_rat + time * rat
    rat = rat * 2
    mouse = mouse / 2
    day = day + 1
print(day)
print(round(distance_of_mouse, 1), round(distance_of_rat, 1))

这道题我还是掉坑里了,没有考虑到最后两只老鼠相接的情况,那一天的不一定是用了一整天,所以要进行特殊处理一下:time=n/(mouse+rat)
然后就可以做出来了。

9、黑色星期五

在这里插入图片描述

import datetime
year = int(input())  #输入任意年份
days = [datetime.date(year, i, 13) for i in range(1, 13)]  #产生该年每个月13日 的列表
for i in days:
    if i.isoweekday()==5:
        print(i)

这道题用c或者c++来处理的话还是比较难处理的,因为你你不清楚每一天到底是周几,所以python也不能用那种方式去做,直接调用接口,使用函数就可以,看代码,导入datetime库,i.isoweekday()可以获取当天是周几。

10、校验身份证号码并输出个人信息

在这里插入图片描述
在这里插入图片描述

import datetime  # 导入datetime模块用于获取当年年份


def leap(year):
    return True if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0) else False


# 校验身证号中的年月日及校验码
def check_date(id_num):
    """校验身证号中的年月日,年月日值均要合法"""
    # 年份超过当前年,或月份小于1或大于12,或日期小于1或大于31时非法
    if int(id_num[6:10]) > datetime.datetime.now().year or int(id_num[10:12]) < 1 or int(id_num[10:12]) > 12 or int(
            id_num[12:14]) < 1 or int(id_num[12:14]) > 31:
        return False
    if int(id_num[10:12]) in [4, 6, 9, 11] and int(id_num[12:14]) > 30:  # 当月份为4,6,9,11时,日期超过30即非法
        return False
    if int(id_num[10:12]) == 2 and int(id_num[12:14]) > 29:  # 月份为2时,日期大于29便非法
        return False
    if int(id_num[10:12]) == 2 and leap(int(id_num[6:10])) == False and int(
            id_num[12:14]) > 28:  # 月份为2时,如果不是闰年,日期大于28便非法
        return False
    else:
        return True


def check_sum(id_num):
    """计算检验位"""
    ls = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
    id_num_sum = sum([ls[i] * int(id_num[i]) for i in range(17)])  # 计算校验和
    if id_num[17] == 'X':
        return True if id_num_sum % 11 == 2 else False
    elif (id_num_sum % 11 + int(id_num[17])) % 11 == 1:
        return True
    else:
        return False


def print_info(id_num):
    """输出信息"""
    year = int(id_num[6:10])
    month = id_num[10:12]
    day = id_num[12:14]
    if len(id_num) == 18 and check_date(id_num) and check_sum(id_num):  # 先判断长度是否是18位,再判断校验和
        gender = '女' if int(id_num[16]) % 2 == 0 else '男'
        print('身份证号码校验为合法号码')
        print('出生:{}年{}月{}日'.format(year, month, day))
        # print('年龄:{}'.format(datetime.datetime.now().year - year))
        print('性别:{}'.format(gender))
    else:
        print('身份证校验错误')


if __name__ == '__main__':
    id_number = input()
    print_info(id_number)

这道题直接看代码吧

11、输出三角形字符阵列

在这里插入图片描述

n = int(input())
s = 'A'
if 1<=n<7:
    for i in range(n):
        for j in range(n-i):
            print(s,end = ' ')
            s=chr(ord(s)+1)
        print()

这里了解ord()函数:
ord()函数是Python中的一个库函数,用于从给定字符值中获取数字值,它接受一个字符并返回一个整数,即用于将字符转换为整数,即用于获取ASCII给定字符的值 。
还有chr()函数:
chr()函数是Python中的一个库函数,用于从给定的ASCII码 (整数值)中获取字符值,它接受一个数字(应为ASCII码 )并返回字符。

12、温度转换异常处理

在这里插入图片描述

try:
    TempStr = input()
    if TempStr[-1] in ['F', 'f']:
        C = (eval(TempStr[0:-1]) - 32) / 1.8
        print("{:.2f}C".format(C))
    elif TempStr[-1] in ['C', 'c']:
        F = 1.8 * eval(TempStr[0:-1]) + 32
        print("{:.2f}F".format(F))
    else:
        print("输入错误,末位只能是'C','c','F','f'")
except NameError:
    print('试图访问的变量名不存在')
except SyntaxError:
    print('存在语法错误')
except Exception as e:
    print(e)

这里注意异常处理。

13、判断火车票座位

在这里插入图片描述

s = input()
try:
    if 2 <= len(s) < 4 and 1 <= int(s[:-1]) <= 17:
        if s[-1] in ['A', 'a', 'F', 'f']:
            print('窗口')
        elif s[-1] in ['C', 'c', 'D', 'd']:
            print('过道')
        elif s[-1] in ['B', 'b']:
            print('中间')
        else:
            print('座位号不存在')
    else:
        print('座位号不存在')
except:
    print('座位号不存在')

in 和 异常判断

14、素数求和

在这里插入图片描述

def isprime(n):
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return False
    else:
        return True

def f(n):
    sumPrime,count=0,0
    for i in range(n,1,-1):
        if isprime(i):
            sumPrime = sumPrime + i
            count = count + 1
        if count == 10:
            return sumPrime
        
num = int(input())
print(f(num))

先写一个判断是不是素数的函数,然后要求最大的十个素数,我们可以倒着循环。

15、回文素数

在这里插入图片描述

def is_prime(n):
    """判断素数的函数,接收一个正整数为参数,参数是素数时返回True,否则返回False
    减小判定区间,减少循环次数,提升效率。
    """
    if n < 2:
        return False      # 0、1、负数以及偶数都不是素数
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:    # 能被2到其根号n之间的整数整除的数不是素数
            return False
    else:
        return True       # for循环正常结束,未遇到return的数是素数


def palindromic(num):
    """接收一个数字为参数,判定其是否为回文数,返回布尔值。"""
    if str(num) == str(num)[::-1]:
        return True
    else:
        return False


def output_prime(num):
    """接收一个正整数num为参数,在一行中从小到大输出前num个回文素数。
    函数无返回值
    """
    i = 2                      # 从最小的素数2开始测试
    count = 0                  # 计数器置0
    while True:                # 无限循环
        if palindromic(i) and is_prime(i):  # 先判断回文再判断素数,效率高
            print(i, end=' ')  # i为回文素数时输出i,输出后不换行
            count = count + 1  # 每发现一个回文素数计数增加1
        if count == num:       # 如果找到回文素数数量与要求数量相同时
            break              # 结束循环
        i = i + 1              # 测试下一个数字


if __name__ == "__main__":
    n = int(input())
    output_prime(n)

判断是不是回文数可以这样:str(num) == str(num)[::-1]

总结

不管是流程控制还是写函数,都要明确每一步的目的

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长街395

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值