CSDN话题挑战赛第2期
参赛话题:学习笔记
题目描述
输入一个偶数 N,验证 4~N 所有偶数是否符合哥德巴赫猜想:任一大于 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10,10=3+7=5+5,则 10=5+5 是错误答案。
输入格式
第一行输入一个正偶数 N(4 ≤ N ≤ 10000)
输出格式
输出
N − 2 2 \dfrac{N-2}{2} 2N−2
行。对于第 i 行:首先先输出正偶数 2i+2,然后输出等号,再输出加和为 2i+2 且第一个加数最小的两个质数,以加号隔开。
样例输入
10
样例输出
4=2+2 6=3+3 8=3+5 10=3+7
import math
def is_prime(num):
"""判断是否是素数"""
if num == 1:
return False
k = int(math.sqrt(num))
for i in range(2, k + 1):
if num % i == 0:
return False
return True
n = int(input().strip())
for num in range(4, n+1, 2):
for i in range(2, num):
if is_prime(i) and is_prime(num - i):
print(f'{num}={i}+{num-i}')
break
题目描述
HXY得到了一些卡片,这些卡片上标有数字 0 或 5 。现在她可以选择其中一些卡片排成一列,使得排出的一列数字组成的数最大,且满足被 90 整除这个条件。同时,这个数必须为合法的某个非负整数,即不能含有前导 0,即 0 不能作为这串数的首位。但是特殊地,整数 0 满足条件。如果不能排出这样的数,输出“-1”。
输入格式
第一行,卡片的个数 n(n ≤ 1000)。
第二行,分别给出了这 n 个数(只能为数字 5 或 0)。
输出格式
仅一行,如果可以排出,则输出这个数。否则输出
-1
。样例输入 #1
4 5 0 5 0
样例输出 #1
0
样例输入 #2
11 5 5 5 5 5 5 5 5 0 5 5
样例输出 #2
5555555550
样例输入 #3
2 5 5
样例输出 #3
-1
n = int(input().strip())
nums = [int(i) for i in input().strip().split()]
# 不包含0的肯定不满足条件
if nums.count(0) == 0:
print(-1)
else:
# 统计5的个数
count_5 = nums.count(5)
# 统计0的个数
count_0 = nums.count(0)
# print(count_5)
if count_5 >= 9:
# 有多少组 9个5
k = count_5 // 9
max_num = '5' * (9 * k) + '0' * count_0
print(max_num)
else:
print(0)
题目描述
Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。
所有 N(1≤N≤20,000) 头奶牛都有一个确定的身高 Hi(1≤Hi≤10,000)。设所有奶牛身高的和为S。书架的高度为B,并且保证 1≤B≤S<2,000,000,007。
为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。
显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。
输入格式
- 第 1 行: 2 个用空格隔开的整数:N 和 B;
- 第 2~N+1 行: 第 i+1 行是 1 个整数:Hi。
输出格式
- 第 1 行: 输出 1 个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部
样例输入
6 40 6 18 11 13 19 11
样例输出
3
N, B = map(int, input().strip().split())
H = []
for i in range(N):
h_i = int(input().strip())
H.append(h_i)
# 降序排序
H = sorted(H, reverse=True)
count = 0
S = 0
for num in H:
if S < B:
S += num
count += 1
print(count)
题目描述
给出 n,请输出一个直角边长度是 n 的数字直角三角形。所有数字都是 2 位组成的,如果没有 2 位则加上前导 0。
输入格式
输入一个正整数 n(1≤n≤13)。
输出格式
输出如题目要求的数字直角三角形。
样例输入
5
样例输出
0102030405 06070809 101112 1314 15
n = int(input().strip())
if 1 <= n <= 13:
sum = 0
for i in range(n, 0, -1):
print(''.join(['{:02d}'.format(sum + j) for j in range(1, i+1)]))
sum += i
题目描述
模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。
输入格式
输入矩阵的规模,不超过 9。
输出格式
输出矩形和正方形
样例输入
4
样例输出
01020304 05060708 09101112 13141516 01 0203 040506 07080910
n = int(input().strip())
if 1 <= n <= 9:
# 输出矩阵
sum = 0
for i in range(n):
print(''.join(['{:02d}'.format(sum + j) for j in range(1, n+1)]))
sum += n
print()
# 输出三角形
sum = 0
for i in range(1, n+1):
print(' '*(n-i)+''.join(['{:02d}'.format(sum + j) for j in range(1, i+1)]))
sum += i
题目描述
现有 N 名同学参加了期末考试,并且获得了每名同学的信息:语文、数学、英语成绩(均为不超过 150 的自然数)。如果某对学生 的每一科成绩的分差都不大于 5,且总分分差不大于 10,那么这对学生就是“旗鼓相当的对手”。现在想知道这些同学中,有几对“旗鼓相当的对手”?同样一个人可能会和其他好几名同学结对。
输入格式
第一行一个正整数 N(2≤N≤1000)。
接下来 N 行,每行三个整数,其中第 i 行表示第 i 名同学的语文、数学、英语成绩。最先读入的同学编号为 1。
输出格式
输出一个整数,表示“旗鼓相当的对手”的对数。
样例输入 #1
3 90 90 90 85 95 90 80 100 91
样例输出 #1
2
#include
#include
struct Student
{
int chinese;
int math;
int english;
int total;
};
int main()
{
int n, i, j, count=0;
scanf("%d", &n);
struct Student stu[n];
for (i=0; i<n; i++)
{
scanf("%d %d %d", &stu[i].chinese, &stu[i].math, &stu[i].english);
stu[i].total = stu[i].chinese + stu[i].math + stu[i].english;
}
for (i=0; i<n-1; i++)
{
for (j=i+1; j<n; j++)
{
int c, m, e, t;
// 计算每一科的分差(绝对值)
c = abs(stu[i].chinese - stu[j].chinese);
m = abs(stu[i].math - stu[j].math);
e = abs(stu[i].english - stu[j].english);
// 计算总分的分差(绝对值)
t = abs(stu[i].total - stu[j].total);
if (c <= 5 && m <= 5 && e <= 5 && t <= 10)
{
count++;
}
}
}
printf("%d", count);
return 0;
}
题目描述
给出一个不大于 9 的正整数 n,输出 n×n
的蛇形方阵。从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字都会占用 3 个字符,前面使用空格补齐。
输入格式
输入一个正整数 n(1≤n≤9),含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
样例输入
4
样例输出
1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
#include
int main()
{
int i, j, n, m, num[10][10];
scanf("%d",&n);
i=1;
m=1;
if(i==1) num[1][i]=1;
while(i < n+1-i)
{
for(j = i; j <= n+1-i; j++)
num[i][j] = m++;
for(j = i+1; j <= n+1-i; j++)
num[j][n+1-i] = m++;
for(j = n-i; j >= i; j--)
num[n+1-i][j] = m++;
for(j = n-i; j >= i+1; j--)
num[j][i] = m++;
i++;
if(i == n+1-i)
{
num[i][i] = n*n;
break;
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
printf("%3d",num[i][j]);
}
if (i != n)
printf("\n");
}
return 0;
}
题目描述
正确的打字正成为文化的重要组成部分。如果你仍然没有使用所有的十根手指来打字,你必须重新学习打字——然后你会打字更快,感觉更舒适和愉快。
有很多网站教你正确打字。下图描述了基本原理:用同一个指针按所需的键是同一颜色的。黄色键需要用小指按下,蓝色键需要用无名指,绿色键需要用中指,红色键需要用食指。自然,左手按键盘的左侧(从
5
、T
、G
、B
开始向左的键),右手按右侧(从6
、Y
、H
、N
开始向右的键),拇指负责空格。您的任务是输出每根手指(拇指除外)正确输入给定字符串的分别按下的次数。
输入格式
仅一行一个字符串 s(不超过50个字符)。字符串不包含空格,只包含上面图像中包含的字符。
输出格式
输出必须由八行组成,每行一个整数,表示从左到右观察到的每个手指的按键次数(拇指除外)。
样例输入 #1
AON=BOO;
样例输出 #1
1 0 0 1 1 0 3 2
样例输入 #2
PRINT'NY'[NASLA]
样例输出 #2
2 1 0 2 4 1 1 5
样例输入 #3
VIDI,KO,JE,DOSA
样例输出 #3
1 1 3 1 1 6 2 0
提示
令 |s| 表示输入字符串的长度,则对于 100% 的数据,有1≤∣s∣≤50。
# a~b表示左手,小指~食指 keys:可按键的范围 times:该指按键次数
a = {'keys': ['1', 'Q', 'A', 'Z'], 'times': 0}
b = {'keys': ['2', 'W', 'S', 'X'], 'times': 0}
c = {'keys': ['3', 'E', 'D', 'C'], 'times': 0}
d = {'keys': ['4', 'R', 'F', 'V', '5', 'T', 'G', 'B'], 'times': 0}
# e~h表示右手,食指~小指
e = {'keys': ['6', '7', 'Y', 'U', 'H', 'J', 'N', 'M'], 'times': 0}
f = {'keys': ['8', 'I', 'K', ','], 'times': 0}
g = {'keys': ['9', 'O', 'L', '.'], 'times': 0}
h = {'keys': ['0', '-', '=', 'P', '[', ']', ';', "'", "/"], 'times': 0}
s = input().strip()
for i in s:
if i in a['keys']:
a['times'] += 1
if i in b['keys']:
b['times'] += 1
if i in c['keys']:
c['times'] += 1
if i in d['keys']:
d['times'] += 1
if i in e['keys']:
e['times'] += 1
if i in f['keys']:
f['times'] += 1
if i in g['keys']:
g['times'] += 1
if i in h['keys']:
h['times'] += 1
print(a['times'])
print(b['times'])
print(c['times'])
print(d['times'])
print(e['times'])
print(f['times'])
print(g['times'])
print(h['times'])