跳至主要內容

浙江工业大学 Python 期末考复习

AI悦创原创Python最大公约数GCD辗转相除法欧几里得算法算法实现浙江工业大学浙江工业大学Python浙江工业大学Python真题Python最大公约数GCD辗转相除法欧几里得算法算法实现浙江工业大学浙江工业大学Python浙江工业大学Python真题大约 10 分钟...约 3070 字

1

编程题

  1. 商场购物,输入所有已购买商品价格,根据总价进行打折:如果总价小于等于 500 元,打 95 折,500 到 1000 (含)之间,打 9折,1000 到 2000(含)之间打 85 折,2000 以上打 8 折,打折后,满 200 减 50,输出最终需要支付的金额,保留小数点后面两位。
def calculate_price(prices):
    total_price = sum(prices)

    if total_price <= 500:
        discount_price = total_price * 0.95
    elif total_price <= 1000:
        discount_price = total_price * 0.9
    elif total_price <= 2000:
        discount_price = total_price * 0.85
    else:
        discount_price = total_price * 0.8

    if discount_price >= 200:
        final_price = discount_price - 50
    else:
        final_price = discount_price

    return round(final_price, 2)


# 例如,商品价格分别为 300 元,200 元,500 元,和 1000 元
prices = [300, 200, 500, 1000]
print(calculate_price(prices))
  1. 校园十佳歌手决赛现场,8 个评委对入围的 20 位选手给出了最终的评分,编程以列表形式输入 20 位选手的编号和所有评分成绩,如 [[1, 97, 98...], [2, 94, 92...], [3, 85, 84...],根据评分表,去除一个最高分和一个最低分后求平均,并按平均分由高到低输出选手编号和最后得分。
def calculate_scores(players):
    results = []

    for player in players:
        scores = sorted(player[1:])  # 对成绩进行排序
        scores = scores[1:-1]  # 去除最高和最低分
        avg_score = sum(scores) / len(scores)  # 计算平均分
        results.append([player[0], round(avg_score, 2)])  # 保存选手编号和平均分

    results.sort(key=lambda x: x[1], reverse=True)  # 根据平均分进行排序

    return results


# 例如,以下是三位选手的编号和评分:
players = [[1, 97, 98, 95, 92, 96, 94, 90, 93, 95],
           [2, 94, 92, 93, 95, 96, 94, 90, 91, 93],
           [3, 85, 84, 87, 88, 86, 85, 86, 88, 89]]
print(calculate_scores(players))
  1. (1)编写函数 prime() ,传递参数为整数,返回判断结果:是素数或者不是素数;

    (2)编写函数 demo() ,输入一个数 n,n 的范围为 [2, 20],如果不满足条件,重新输入,直到 n 满足条件,判断 n 以内的所有素数,并放入一个列表(如输入 n=11,列表为 [2, 3, 5, 7, 11]

    (3)在 demo 中产生 20 个范围为 [1000, 5000] 的随机整数列表,找出不能被 n 以内所有素数整除的元素,并以列表形式升序输出。「提示:本小题类似素数判断,只是因子不是 2 到 i-1,而是 n 中的所有值」

import random

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

def demo():
    while True:
        n = int(input("请输入一个在 [2, 20] 范围内的数:"))
        if 2 <= n <= 20:
            break
        print("输入不满足条件,请重新输入!")

    primes = [i for i in range(2, n+1) if prime(i)]
    print("n以内的所有素数列表:", primes)

    random_numbers = [random.randint(1000, 5000) for _ in range(20)]
    result = sorted([num for num in random_numbers if any(num % p == 0 for p in primes)])
    
    print("不能被 n 以内所有素数整除的元素列表:", result)

demo()
题解

(1)编写函数 prime() ,用于判断一个数是否为素数:

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

在这个函数中,我们首先检查数字是否小于2,因为2是最小的素数。然后,我们迭代从2到n的平方根的所有数字,检查n是否可以被这些数字整除。如果n能被任何一个这样的数字整除,那么n就不是素数。如果没有找到这样的因子,那么n就是素数。

(2)编写函数 demo() ,用于判断 n 以内的所有素数:

import random

def demo():
    n = int(input("请输入一个在 [2, 20] 之间的整数:"))
    while n < 2 or n > 20:
        n = int(input("请输入一个在 [2, 20] 之间的整数:"))
    primes = [i for i in range(2, n + 1) if prime(i)]
    print(f"n 以内的所有素数为: {primes}")

    random_numbers = [random.randint(1000, 5000) for _ in range(20)]
    non_divisible = [num for num in random_numbers if any(num % p != 0 for p in primes)]
    non_divisible.sort()
    print(f"不能被 n 以内所有素数整除的元素为: {non_divisible}")

在这个函数中,我们首先提示用户输入一个在[2, 20]之间的整数。如果输入的数不在这个范围内,我们会继续提示用户,直到他们输入一个符合条件的数。然后,我们使用列表推导式找到这个范围内的所有素数,并将这些素数打印出来。

然后,我们生成20个在[1000, 5000]范围内的随机整数。我们再次使用列表推导式,找到那些不能被n以内所有素数整除的数,将这些数排序,并将它们打印出来。

需要注意的是,random.randint(a, b) 函数返回一个在[a, b]范围内的随机整数,其中包括a和b。any() 函数返回一个布尔值,表示是否有任何元素在其内部为 True

  1. 在文件 'letter.txt' 中有各种字符,分别统计字母(不区分大小写)、数字及其他字符(不能包含换行符)的个数,输出结果如下所示(注意左对齐和右对齐,字符宽度可以自己定义);
letters    580
digits     33
others     161
from collections import defaultdict

# 初始化一个默认字典用于计数
counts = defaultdict(int)

# 读取文件
with open('letter.txt', 'r') as f:
    for line in f:
        for ch in line.rstrip('\n'):  # 排除换行符
            if ch.isalpha():  # 判断字符是否为字母
                counts['letters'] += 1
            elif ch.isdigit():  # 判断字符是否为数字
                counts['digits'] += 1
            else:
                counts['others'] += 1  # 其他字符

# 输出结果
for key, count in counts.items():
    print(f'{key:<10} {count:>3}')  # 注意左对齐(<)和右对齐(>),这里字符宽度设定为 10 和 3

知识点补充

在Python中,%5d是一个旧式的字符串格式化指令,用于格式化整数(decimal)。

这个格式化指令的组成是一个%符号,后面跟着一个整数和一个字母d。这个整数定义了该字段的最小宽度。如果要格式化的数字的位数少于这个宽度,那么输出的字符串前面将会用空格填充至指定的宽度。

%5d表示一个占位符,表示在这个位置将被一个整数取代,整数将以至少5个字符的宽度显示。如果整数的数字少于5位,那么结果会在左边用空格填充以达到5个字符的宽度。例如:

print("%5d" % 123)
print("%5d" % 45)
print("%5d" % 7)

以上面的代码为例,输出将会是:

  123
   45
    7

注意每行数字前面的空格。第一行前面有两个空格,因为123是一个三位数,需要两个额外的空格来达到5个字符的宽度。第二行前面有三个空格,因为45是一个两位数,需要三个额外的空格来达到5个字符的宽度。第三行前面有四个空格,因为7是一个一位数,需要四个额外的空格来达到5个字符的宽度。

因此,在你的代码中,print("letters%5d" % a)print("digits%5d" % b)print("others%5d" % c)将分别输出"a的值、b的值和c的值",并且每个值都将至少以5个字符的宽度显示。

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度