PTA基础题练习4

1. 数组元素循环右移

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将最后M个数循环移至最前面的M个位置。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4
n, m = map(int, input().strip().split(' '))
numbers = [int(i) for i in input().strip().split(' ')]
m %= n
numbers = numbers[-m:] + numbers[:-m]
print(' '.join(map(str, numbers)))

2. 数字分类

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:

  • A1 = 能被 5 整除的数字中所有偶数的和;
  • A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1n2+n3n4⋯;
  • A3 = 被 5 除后余 2 的数字的个数;
  • A4 = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
  • A5 = 被 5 除后余 4 的数字中最大数字。

输入格式:

每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。

输出格式:

对给定的 N 个正整数,按题目要求计算 A1~ A5 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若分类之后某一类不存在数字,则在相应位置输出 N

输入样例 1:

13 1 2 3 4 5 6 7 8 9 10 20 16 18

输出样例 1:

30 11 2 9.7 9

输入样例 2:

8 1 2 4 5 6 7 9 16

输出样例 2:

N 11 2 N 9
numbers = [int(i) for i in input().strip().split(' ')]
a1 = 0
count_a1 = 0
list1 = []
a3 = 0
a4 = 0
count_a4 = 0
a5 = 0
if numbers[0] <= 1000:
    for number in numbers[1:]:
        if number <= 1000:
            if number % 10 == 0:
                a1 += number
                count_a1 += 1
            if number % 5 == 1:
                list1.append(number)
            if number % 5 == 2:
                a3 += 1
            if number % 5 == 3:
                a4 += number
                count_a4 += 1
            if number % 5 == 4:
                a5 = number if a5 < number else a5
    a1 = a1 if count_a1 > 0 else 'N'
    len_list1 = len(list1)
    a2 = 0
    if len_list1 > 0:
        for i in range(len_list1):
            if i % 2 == 0:
                a2 += list1[i]
            else:
                a2 -= list1[i]
    a2 = a2 if len_list1 > 0 else 'N'
    a3 = a3 if a3 > 0 else 'N'
    a4 = round((a4 / count_a4), 1) if count_a4 > 0 else 'N'
    a5 = a5 if a5 > 0 else 'N'
    print(f'{a1} {a2} {a3} {a4} {a5}')

3. 数素数

Pi 表示第 i 个素数。现任给两个正整数 MN≤104,请输出 PMPN 的所有素数。

输入格式:

输入在一行中给出 MN,其间以空格分隔。

输出格式:

输出从 PMPN 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

输入样例:

5 27

输出样例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
import math


def is_prime(n):
    if n == 1:
        return False
    k = int(math.sqrt(n))
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True


m, n = map(int, input().strip().split(' '))
primes = [0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
num = 31
count1 = 10
while count1 < n:
    if is_prime(num):
        primes.append(num)
        count1 += 1
    num += 2

# print(primes)
count2 = 0
for i in range(m, n + 1):
    count2 += 1
    if count2 % 10 != 0 and i != n:
        print(primes[i], end=' ')
    else:
        print(primes[i])

4. 部分A+B

正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA。例如:给定 A=3862767,DA=6,则 A 的“6 部分”PA 是 66,因为 A 中有 2 个 6。

现给定 ADABDB,请编写程序计算 PA+PB

输入格式:

输入在一行中依次给出 ADABDB,中间以空格分隔,其中 0<A,B<109

输出格式:

在一行中输出 PA+PB 的值。

输入样例 1:

3862767 6 13530293 3

输出样例 1:

399

输入样例 2:

3862767 1 13530293 8

输出样例 2:

0
a, b, c, d = map(str, input().strip().split(' '))
# 统计出现次数
count_b_a = a.count(b)
count_d_c = c.count(d)
# print(count_b_a)
# print(count_d_c)
b_a = b * count_b_a if count_b_a > 0 else '0'
d_c = d * count_d_c if count_d_c > 0 else '0'
# print(b_a, d_c)
ans = int(b_a) + int(d_c)
print(ans)

5. 字符统计

找出一段给定文字中出现最频繁的那个英文字母。

输入格式:

输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。

输出格式:

在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。

输入样例:

This is a simple TEST.  There ARE numbers and other symbols 1&2&3...........

输出样例:

e 7
str1 = input().strip()
str1 = str1.casefold()
dict_word = {}
max_count = 0
for i in str1:
    if i.isalpha():
        dict_word[i] = str1.count(i)
        if str1.count(i) > max_count:
            max_count = str1.count(i)
list_a = []
for k, v in dict_word.items():
    if v == max_count:
        list_a.append(k)

print(f'{sorted(list_a)[0]} {max_count}')

6. 编程团体赛

编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。

现给定所有队员的比赛成绩,请你编写程序找出冠军队。

输入格式:

输入第一行给出一个正整数 N(≤104),即所有参赛队员总数。随后 N 行,每行给出一位队员的成绩,格式为:队伍编号-队员编号 成绩,其中队伍编号为 1 到 1000 的正整数,队员编号为 1 到 10 的正整数,成绩为 0 到 100 的整数。

输出格式:

在一行中输出冠军队的编号和总成绩,其间以一个空格分隔。注意:题目保证冠军队是唯一的。

输入样例:

6
3-10 99
11-5 87
102-1 0
102-3 100
11-9 89
3-2 61

输出样例:

11 176
n = int(input().strip())
dict_score = {}
for i in range(n):
    str1 = input().strip().split(' ')
    team_id, p_id = map(int, str1[0].split('-'))
    score = int(str1[1])
    if str(team_id) in dict_score.keys():
        dict_score[str(team_id)] += score
    else:
        dict_score[str(team_id)] = score
list_sort = sorted(dict_score.items(), key=lambda x:x[1], reverse=True)
print(f'{list_sort[0][0]} {list_sort[0][1]}')

7. 有多少不同的值

当自然数 n 依次取 1、2、3、……、N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分。)

输入格式:

输入给出一个正整数 N(2≤N≤104)。

输出格式:

在一行中输出题面中算式取到的不同值的个数。

输入样例:

2017

输出样例:

1480
n = int(input().strip())
numbers = set()  # 定义空集合
for i in range(1, n+1):
    a = int(i / 2)
    b = int(i / 3)
    c = int(i / 5)
    numbers.add(a + b + c)
# 得到集合长度
ans = len(numbers)
print(ans)

8. B是A的多少倍

设一个数 A 的最低 D 位形成的数是 ad。如果把 ad 截下来移到 A 的最高位前面,就形成了一个新的数 BBA 的多少倍?例如将 12345 的最低 2 位 45 截下来放到 123 的前面,就得到 45123,它约是 12345 的 3.66 倍。

输入格式:

输入在一行中给出一个正整数 A(≤109)和要截取的位数 D。题目保证 D 不超过 A 的总位数。

输出格式:

计算 BA 的多少倍,输出小数点后 2 位。

输入样例 1:

12345 2

输出样例 1:

3.66

输入样例 2:

12345 5

输出样例 2:

1.00
list1 = input().strip().split(' ')
a, b = list1[0], list1[1]
c = a[-int(b):] + a[:-int(b)]
# print(c)
ans = int(c) / int(a)
print('%.2f' % ans)

9. 销量冠军

在试卷列表中,系统列出了每份试卷的单价及当前的购买人次。请你根据这些信息找出所有试卷中的销量(即购买人次)冠军和销售额冠军。

输入格式:

输入首先在第一行中给出一个正整数 N(≤104),随后 N 行,每行给出一份卷子的独特 ID (由小写字母和数字组成的、长度不超过8位的字符串)、单价(为不超过 100 的正整数)和购买人次(为不超过 106 的非负整数)。

输出格式:

在第一行中输出销量冠军的 ID 及其销量,第二行中输出销售额冠军的 ID 及其销售额。同行输出间以一个空格分隔。题目保证冠军是唯一的,不存在并列。

输入样例:

4
zju007 39 10
pku2019 9 332
pat2018 95 79
qdu106 19 38

输出样例:

pku2019 332
pat2018 7505
n = int(input().strip())
products = []
max_sales = 0
max_sales_value = 0
for i in range(n):
    product_ID, price, sales = input().strip().split(' ')
    # print(product_ID, price, sales)
    if max_sales < int(sales):
        max_sales = int(sales)
    if max_sales_value < int(price) * int(sales):
        max_sales_value = int(price) * int(sales)
    products.append(
        {'ID': product_ID, 'price': int(price), 'sales': int(sales), 'sales_value': (int(price) * int(sales))})
# print(products)
for product in products:
    if product['sales'] == max_sales:
        print(f'{product["ID"]} {product["sales"]}')
for product in products:
    if product['sales_value'] == max_sales_value:
        print(f'{product["ID"]} {product["sales_value"]}')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦里逆天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值