7-1 统计字符个数

输入若干的字符串,每个字符串中只包含数字字符和大小写英文字母,统计字符串中有出现的不同字符的出现次数。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个字符串(不超过80个字符)。

输出格式:
对于每组测试,按字符串中有出现的字符的ASCII码升序逐行输出不同的字符及其个数(两个数据之间留一个空格),每两组测试数据之间留一空行,输出格式参照输出样例。

输入样例:
12123
A1c1B
输出样例:
1 2
2 2
3 1

1 2
A 1
B 1
c 1



代码示例

i=0
while True:
    try:
        s = input().strip()
        if not s:
            break
        cnt = [0] * 256
        if i!=0:
            print()
        for c in s:
            cnt[ord(c)] += 1
        for i in range(256):
            if cnt[i]:
                print(chr(i), cnt[i])
                i+=1
    except:
        break

这里用了一个 try-except 块,是为了在读取完所有数据之后结束程序。





7-2 成绩统计

现有某班级Python考试成绩,请你帮老师做一下成绩统计,找出最高分、最低分,算出平均分,统计出不及格人数。

输入格式:
输入在第一行给出班级人数n,第二行为n个学生的成绩(0~100之间的整数),中间用空格分隔。

输出格式:
输出共四行,分别为最高分、最低分、平均分和不及格人数,其中平均分保留1位小数。

输入样例:
10
80 95 75 85 90 55 66 88 100 58
输出样例:
Max: 100
Min: 55
Ave: 79.2
Fail: 2


代码示例

n=int(input())
x=list(map(int,input().split()[0:n]))
c=0
for i in x:
    if i<60:
        c+=1
print("Max: %d\nMin: %d\nAve: %.1f\nFail: %d"%(max(x),min(x),sum(x)/n,c))






7-3 p080最简单的单词

分数 10
作者 吴敏华
单位 首都师范大学
现有大量单词,学习者对单词评分,评价其难度。现有若干个学习者对他学习的10个的单词评分,不同的人可能对同一个单词评分。如果单词被多个人评分,它的综合评分是所有评分的平均值。找出综合评分最小的单词。

输入格式:
第一行T,表示有T组数据。
对于每组数据:
第一行N,表示有N个人。
接下来输入N*10行,每一行有一个单词,一个整数(表示评分),由空格隔开。

输出格式:
对于每组数据,输出最简单的单词。

输入样例:
2
2
ability 10
able 1
about 2
above 3
abroad 4
absent 5
accent 6
accept 7
accident 8
accord 9
apple 2
able 10
about 4
above 5
abroad 3
absent 5
accent 6
accept 7
accident 8
accord 9
1
ability 10
able 1
about 2
above 3
abroad 4
absent 5
accent 6
accept 7
accident 8
accord 9
输出样例:
apple
able


代码示例

T = int(input())

for _ in range(T):
    N = int(input())
    words_scores = {}

    for i in range(N*10):
        word, score = input().split()
        if word not in words_scores:
            words_scores[word] = [int(score)]
        else:
            words_scores[word].append(int(score))

    min_avg_score = float('inf')
    min_word = ''
    for word, scores in words_scores.items():
        avg_score = sum(scores) / len(scores)
        if avg_score < min_avg_score:
            min_avg_score = avg_score
            min_word = word

    print(min_word)

代码思路如下:

读入整个测试用例的数量 T;
对于每个测试用例,读入评分者的数量 N;
使用一个字典 words_scores 存储每个单词的评分,其中字典的键为单词,值为该单词的评分列表;
遍历 words_scores 中的每个单词和其评分列表,计算该单词的平均分,找到平均分最小的单词,输出其名称即可。




7-4 进步排行榜

假设每个学生信息包括“用户名”、“进步总数”和“解题总数”。解题进步排行榜中,按“进步总数”及“解题总数”生成排行榜。要求先输入n个学生的信息;然后按“进步总数”降序排列;若“进步总数”相同,则按“解题总数”降序排列;若“进步总数”和“解题总数”都相同,则排名相同,但输出信息时按“用户名”升序排列。

输入格式:
首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先输入一个正整数n(1 < n < 50),表示学生总数。然后输入n行,每行包括一个不含空格的字符串s(不超过8位)和2个正整数d和t,分别表示用户名、进步总数和解题总数。

输出格式:
对于每组测试,输出最终排名。每行一个学生的信息,分别是排名、用户名、进步总数和解题总数。每行的各个数据之间留一个空格。注意,进步总数和解题总数都相同的学生其排名也相同。

输入样例:
2
6
usx15131 21 124
usx15101 27 191
usx15113 31 124
usx15136 18 199
usx15117 27 251
usx15118 21 124
10
usx15131 21 124
usx15101 27 191
usx15107 24 154
usx15113 31 124
usx15117 25 251
usx15118 21 124
usx15119 22 117
usx15121 43 214
usx15128 21 124
usx15136 28 199
输出样例:
1 usx15113 31 124
2 usx15117 27 251
3 usx15101 27 191
4 usx15118 21 124
4 usx15131 21 124
6 usx15136 18 199
1 usx15121 43 214
2 usx15113 31 124
3 usx15136 28 199
4 usx15101 27 191
5 usx15117 25 251
6 usx15107 24 154
7 usx15119 22 117
8 usx15118 21 124
8 usx15128 21 124
8 usx15131 21 124
来源:
[1] 黄龙军, 等. 大学生程序设计竞赛入门—C/C++程序设计(微课视频版), 北京:清华大学出版社, 2020.11. ISBN:9787302564744
[2] 黄龙军.程序设计竞赛入门(Python版),北京:清华大学出版社,2021.4. ISBN:9787302571230


代码示例

N = int(input())
for i in range(N):
    n = int(input())
    total = []
    for k in range(n):
        x=input().split()
        x[1] = int(x[1])
        x[2] = int(x[2])
        total.append(x)
    total.sort(key=lambda item:(-item[1], -item[2],item[0]))
    for i in range(n):
        total[i].insert(0,i+1)

    total[0][0]=1
    for i in range(1,n):
        if total[i][2]==total[i-1][2] and total[i][3]==total[i-1][3]:
            total[i][0] = total[i-1][0]
    for item in total:
        print(*item)






7-5 计算并输出这组人员的平均年龄(保留2位小数)和其中男性人数

键盘输入一组人员的姓名、性别、年龄等信息,信息间采用空格分隔,计算并输出这组人员的平均年龄(保留2位小数)和其中男性人数。

输入格式:
每人一行,空行回车结束录入,示例格式如下:

张三 男 23

李四 女 21

王五 男 18

输出格式:
平均年龄是20.67 男性人数是2

输入样例:
张三 男 23
李四 女 21
王五 男 18

输出样例:
平均年龄是20.67 男性人数是2


代码示例

c1 = 0
c2 = 0
age = 0
while True:
    x=input().split()
    if len(x)==0:
        break
    c2 += 1
    age +=int(x[2])
    if x[1]=='男':
        c1+=1
print('平均年龄是%.2f 男性人数是%d'%(age/c2,c1))






7-6 统计各行业就业的学生数量,按数量从高到低方式输出。

键盘输入某班各个同学就业的行业名称,行业名称之间用空格间隔(回车结束输入) 。统计各行业就业的学生数量,按数量从高到低方式输出。

输入格式:
输入各个同学行业名称,行业名称之间用空格间隔(回车结束输入)

交通 金融 计算机 交通 计算机 计算机

输出格式:
输出参考格式如下,其中冒号为英文冒号:

计算机:3

交通:2

金融:1

输入样例:
交通 金融 计算机 交通 计算机 计算机
输出样例:
计算机:3
交通:2
金融:1


代码示例

words = input().split()
list = {}
for i in words:
    list[i] = list.get(i, 0) + 1
count_words = [(count, word) for word, count in list.items()]
count_words.sort(reverse=True)
for count, word in count_words:
    print(word + ':' + str(count))






7-7 均方差

求n个非负整数x1, x2 …… xn(xi为第i个元素)的均方差,公式如下:

junfangcha.png

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先输入一个整数n(1≤n≤100),再输入n个整数xi(0≤xi≤1000)。

输出格式:
对于每组测试数据,在一行上输出均方差,结果保留5位小数。

输入样例:
2
4 6 7 8 9
10 6 3 7 1 4 8 2 9 11 5
输出样例:
1.11803
3.03974
出处:
ZJUTOJ 1186


代码示例

import math

T = int(input())

for _ in range(T):
    nums = list(map(int, input().split()))[1:]
    avg = sum(nums) / len(nums)
    ss = sum((x - avg) ** 2 for x in nums) / len(nums)
    s = math.sqrt(ss)
    print('{:.5f}'.format(s))






7-8 按日期排序

输入若干日期,按日期从小到大排序。

输入格式:
本题只有一组测试数据,且日期总数不超过100个。按“MM/DD/YYYY”的格式逐行输入若干日期。

输出格式:
按“MM/DD/YYYY”的格式输出已从小到大排序的各个日期,每个日期占一行。

输入样例:
12/31/2005
10/21/2003
02/12/2004
11/12/1999
10/22/2003
11/30/2005
输出样例:
11/12/1999
10/21/2003
10/22/2003
02/12/2004
11/30/2005
12/31/2005
出处:
ZJUTOJ 1045


代码示例

dates = []
while True:
    try:
        date_str = input()
        month, day, year = map(int, date_str.split('/'))
        dates.append((year, month, day))
    except:
        break

dates.sort()

for year, month, day in dates:
    print('{:02d}/{:02d}/{:04d}'.format(month, day, year))




代码思路如下:

循环读入每一个日期,直到无法读入为止;
对于每一个读入的日期,将其拆分成月、日、年三个部分,然后以元组 (year, month, day) 的形式存储在列表 dates 中;
对列表 dates 进行排序,排序规则为先比较年份、再比较月份、最后比较日期;
遍历排序后的 dates 列表,按照 “MM/DD/YYYY” 的格式输出每个日期。在输出时要注意,月份和日期均需要占用两个字符,而年份需要占用 4 个字符,需要进行补零操作。





7-9 求给定范围内所有数字的平方和

本题目要求读入2个整数A和B,然后输出[A,B]之间所有数的平方和。

输入格式:
在一行中给出2个绝对值不超过100的整数A和B。

输出格式:
输出[A,B]之间所有数的平方和。

输入样例:
在这里给出一组输入。例如:

3 5
输出样例:
在这里给出相应的输出。例如:

50


代码示例

sum=0
a,b=map(int,input().split(' '))
for i in range(a,b+1):
    sum+=i**2
print(sum)






7-10 筛选法求素数

输入一个整数n,求n以内的素数。素数指的是除了1和它本身没有其他因子的整数;最小的素数是2,其余的素数都是奇数;素数序列为:2 3 5 7 11 13 17 19……

输入格式:
测试数据有多组,处理到文件尾。对于每组测试,输入一个整数n(1<n<2000)。

输出格式:
对于每组测试,输出n以内的素数。每两个素数之间留一个空格。

输入样例:
19
输出样例:
2 3 5 7 11 13 17 19


代码示例

import math

def is_prime(num):
    """判断一个数是否为素数"""
    if num <= 1:
        return False
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True

while True:
    try:
        n = int(input())
        primes = [2]
        for i in range(3, n+1, 2):
            if is_prime(i):
                primes.append(i)
        print(' '.join(map(str, primes)))
    except:
        break