编程练习 01

93 阅读6分钟

修订历史:

1 小鲸鱼的学习安排

1.1 题目详情

题目背景: 在一个遥远的海洋王国,小鲸鱼开始了它的初中生活。鲸鱼妈妈为了让小鲸鱼更加优秀,除了日常的学校课程外,还给它报名了各种复习班和兴趣班。然而,小鲸鱼有一个特点,如果一天的学习时间超过八个小时,它就会变得不高兴。我们的任务是帮助小鲸鱼分析下周的日程,以确定它是否会不高兴,以及在哪一天最不高兴。

题目描述: 给定小鲸鱼一周的日程安排,每天包括学校上课时间和课外辅导时间。你需要编写一个程序来判断小鲸鱼在下周的哪一天最不高兴,或者它是否会保持愉快的心情。

输入格式: 输入包含7行,每行包含两个小于10的非负整数,分别表示小鲸鱼在学校上课的时间和课外辅导的时间。

输出格式: 输出一个整数。如果小鲸鱼在整个星期都不会不高兴,则输出0。如果小鲸鱼会不高兴,则输出最不高兴的是周几,用1到7分别表示周一到周日。如果有两天或两天以上不高兴的程度相同,则输出最靠前的一天。

样例输入:

5 3
6 2
7 2
5 3
5 4
0 4
0 6

样例输出:

3

说明: 在样例输入中,周三小鲸鱼的总上课时间为9小时,是所有天数中最多的,因此它在周三最不高兴。

1.2 编码实现

解题思路:

  1. 通过 sys.stdin.readlines() 接收用户多行输入;
  2. 解析并计算每天的学习时间(时间转换为 int 类型),可以使用 map 函数;
  3. 输出
import sys

# S1: 接收用户输入
user_multiline_input = sys.stdin.readlines()

# S2: 解析并计算每天的学习时间
study_hour_days = [single_line.strip("\n").split(" ") for single_line in user_multiline_input]
study_total_hour_days = [sum(map(int, study_hour_day)) for study_hour_day in study_hour_days]

# S3:按要求输出all(hours == 0 for hours in data_day):
if all(hours <= 8 for hours in study_total_hour_days):
    print("0")
else:
    max_unhappiness = max(study_total_hour_days)
    index_study_longest = study_total_hour_days.index(max_unhappiness) + 1
    print(index_study_longest)

2 小鲸鱼的幸运单词

2.1 题目描述

题目背景: 在海洋王国的英语课上,小鲸鱼发现了一个有趣的现象:某些单词可以帮助它更容易地选择正确的答案。这些特殊的单词被称为“Lucky Words”。小鲸鱼想要编写一个程序来识别这些幸运单词,以便在英语选择题中取得更好的成绩。

题目描述: 给定一个由小写字母组成的单词,编写一个程序来判断这个单词是否是“Lucky Word”。一个单词是“Lucky Word”的条件是:该单词中出现次数最多的字母的出现次数(记为 maxn)与出现次数最少的字母的出现次数(记为 minn)之差是一个质数。

输入格式: 输入一个单词,只包含小写字母,长度小于100。

输出格式: 输出两行。第一行是一个字符串,如果输入的单词是“Lucky Word”,则输出 Lucky Word,否则输出 No Answer。第二行是一个整数,如果输入的单词是“Lucky Word”,则输出 maxn−minn 的值,否则输出 0。

样例输入 1:

error

样例输出 1:

Lucky Word
2

样例输入 2:

olympic

样例输出 2:

No Answer
0

提示: 在样例输入 1 中,单词 error 中出现最多的字母 r 出现了 3 次,出现次数最少的字母出现了 1 次,3−1=2,2 是质数。在样例输入 2 中,单词 olympic 中出现最多的字母 i 和出现次数最少的字母都是 1 次,1−1=0,0 不是质数。

2.2 编码实现

解题思路:

  1. 编写函数:素数检测。
  2. 编写函数:实现统计给定单词中不重复字符的次数。可以使用 collections.Counter 函数
  3. 按格式输入结果
from collections import Counter


def is_prime(n):
    """判断一个数是否为质数"""
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

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

# 计算字符串中每个字符出现的频率
def count_char_frequency(text):
    char_count = Counter(text)
    return dict(char_count)


text = input()
# 检查输入是否符合要求:长度小于100且为小写字母
if (len(text) < 100) and text.islower():
    word_freq = count_char_frequency(text)
    difference_max_min = max(word_freq.values()) - min(word_freq.values())
    # 判断字符频率最大值与最小值之差是否为质数
    if is_prime(difference_max_min):
        print("Lucky Word")
        print(difference_max_min)
    else:
        print("No Answer")
        print(0)
else:
    print("error")

3 哥德巴赫猜想

3.1 题目描述

输入一个偶数 N,验证 4∼N 所有偶数是否符合哥德巴赫猜想:任一大于2的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10,10=3+7=5+510=3+7=5+5,则 10=5+5 是要被舍去的答案。要求,4≤N≤10000。

输入格式: 第一行输入一个正偶数 N

输出格式: 输出 (N-2)/2 行。对于第 i 行:首先先输出正偶数 2i+2,然后输出等号,再输出加和为 2i+2 且第一个加数最小的两个质数,以加号隔开。

例如: 输入 10, 输出为 4=2+2 6=3+3 8=3+5 10=3+7

3.2 编码实现

解题思路:

  1. 编写函数:素数检测。可以直接使用第 2 题中的函数。
  2. 遍历 4~(N+1) 之间的所有偶数 even,找出该偶数可以表示成的两个质数(素数,位于 [2,even-1)之和组合。
def is_prime(n):
    """判断一个数是否为质数"""
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

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


def goldbach_conjecture(N):
    # 验证输入的有效性
    # if not isinstance(N, int) or N <= 0:
    #     raise ValueError("N must be a positive integer")
    for even in range(4, N + 1, 2):
        for p1 in range(2, even):
            p2 = even - p1
            if is_prime(p1) and is_prime(p2):
                print(f"{even}={p1}+{p2}")
                break

# 输入偶数 N
N = int(input())
if (N % 2 != 0) or (not isinstance(N, int)) or N < 4 or N > 10000:
    print("error")
goldbach_conjecture(N)