这周题目难度可以,有一个题涉及深搜,但是由于前几天老师刚讲过深搜,我就不多赘述,还有最后两个题目是同类问题,我觉得后一个比前一个简单,建议从后往前做,一定要思考这道题,很有意思,算是一个小竞赛题目了,如果有问题可以私聊我,如果问的人多,我就会单独出解析,麻烦大家点点赞。
6-1 jmu-python-杨辉三角 (10 分)
根据输入的n打印n行杨辉三角型。
函数接口定义:
printYanghui(n):#打印n行杨辉三角型
裁判测试程序样例:
/* 请在这里填写答案 */
n = int(input())
printYanghui(n)
输入格式:
输入n,转化为整数
输出格式:
每个数后面均有一个空格。
输入样例:
5
结尾无空行
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
结尾无空行
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 10:19
def printYanghui(n): # 打印n行杨辉三角型
lis = [[1], [1, 1]]
for i in range(n - 1, n - 3, -1):
for q in range(i):
print(' ', end='')
for q in range(0, n - i):
print('1', end=' ')
print()
for i in range(2, n):
lis1 = [1]
for q in range(1, i):
lis1.append(int(lis[i - 1][q - 1] + lis[i - 1][q]))
lis1.append(1)
lis.append(list(lis1))
for q in range(n - i - 1):
print(' ', end='')
for q in lis1:
print(q, end=' ')
print()
lis1.clear()
6-2 python函数:对字符串数值类型判断 (10 分)
实现isNum()函数,参数为一个字符串,如果这个字符串属于整数(十进制)、浮点数或复数的表示,返回True,否则返回False。
函数接口定义:
函数接口:
isNum(x)
x是个字符串
裁判测试程序样例:
/* 请在这里填写答案 */
在这里给出函数被调用进行测试的例子。例如:
x=input()
print(isNum(x))
输入样例:
在这里给出一组输入。例如:
12.345
结尾无空行
输出样例:
在这里给出相应的输出。例如:
True
结尾无空行
输入样例:
在这里给出一组输入。例如:
abc*
结尾无空行
输出样例:
在这里给出相应的输出。例如:
False
结尾无空行
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 10:54
def isNum(x):
try:
x = float(x)
return True
except:
try:
complex(x)
return True
except:
return False
6-3 使用函数求余弦函数的近似值 (20 分)
本题要求实现一个函数,用下列公式求cos(x)近似值,精确到最后一项的绝对值小于eps(绝对值小于eps的项不要加):
cos(x)=0!x0−2!x2+4!x4−6!x6+...
函数接口定义:funcos(eps,x ),其中用户传入的参数为eps和x;函数funcos应返回用给定公式计算出来,保留小数4位。
函数接口定义:
函数接口:
funcos(eps,x ),返回cos(x)的值。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
/* 请在这里填写答案 */
eps=float(input())
x=float(input())
value=funcos(eps,x )
print("cos({0}) = {1:.4f}".format(x,value))
输入样例:
0.0001 -3.1
输出样例:
cos(-3.1) = -0.9991
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 11:07
def funcos(eps, x): # 返回cos(x)的值。
xn, sum, i = 1, 0, 0
while abs(xn) > eps:
l = 1
for i in range(1, i+1):
l = l * i
xn = (x ** i) / l * ((-1) ** int(i / 2))
if abs(xn) > eps:
sum += xn
i = i + 2
return sum
7-1 求完全数的字典集 (30 分)
本题目要求读入2个正整数m和n,且m<n,求[m,n]之间所有的完全数,并形成字典。完全数:除了自己本身以外所有因子的和等于本身的数。例如6的因子为1,2,3,1+2+3=6,6即为完全数。
输入格式:
以空格分隔输入m,n两个数。
输出格式:
输出得到的字典。
输入样例1:
6 80
结尾无空行
输出样例1:
{6: [1, 2, 3], 28: [1, 2, 4, 7, 14]}
结尾无空行
输入样例2:
-8 -5
结尾无空行
输出样例2:
wrong input
结尾无空行
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 11:07
def yin(x):
lis = []
for i in range(1, int(x / 2) + 1):
if x % i == 0:
lis.append(int(i))
return lis
n1, n2 = map(int, input().split())
if n1<1 or n2<1 or n1>n2:
print('wrong input')
else:
dic = {}
for i in range(n1, n2 + 1):
s1 = yin(i)
if sum(s1) == i:
dic[i] = s1
print(dic)
7-2 阶乘应用 (70 分)
输入大于1的正整数m,计算1×2×3×4×5...×n的积小于m时最大的n。
输入格式:
输入大于1的正整数m
输出格式:
输出n的值
输入样例:
20000
结尾无空行
输出样例:
n= 7
结尾无空行
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 14:25
m = int(input())
s1, i = 1, 1
while True:
if s1 * i >= m:
break
else:
s1 = s1 * i
i = i + 1
print("n= %d" % (i-1))
7-3 数字螺旋方阵 (10 分)
已知n=5、6时的螺旋方阵如输出样例所示,请观察并得到其规律。输入一个正整数n,要求输出n×n个数字构成的螺旋方阵。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入一个正整数n(n≤20)。
输出格式:
对于每组测试,输出n×n的数字螺旋方阵。各行中的每个数据按4位字符宽度输出。
输入样例:
2
5
6
输出样例:
25 24 23 22 21
10 9 8 7 20
11 2 1 6 19
12 3 4 5 18
13 14 15 16 17
36 35 34 33 32 31
17 16 15 14 13 30
18 5 4 3 12 29
19 6 1 2 11 28
20 7 8 9 10 27
21 22 23 24 25 26
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 14:32
def lis(n): # 创建初始数组
arr = [[0] * n for i in range(n)]
return arr
def dfs(arr, x, y, num, n): # 我的思路是和棋盘问题一样,用dfs因为有多种走向问题,但是不完全一样
if n <= 0: return 0
if n == 1:
arr[x][y] = num
return 0
for i in range(n): # 向右
arr[x][y + i] = num
num -= 1
for i in range(n - 1): # 向下
arr[x + 1 + i][y + n - 1] = num
num -= 1
for i in range(n - 1): # 向左
arr[x + n - 1][y + n - 2 - i] = num
num -= 1
for i in range(n - 2): # 向上
arr[x + n - 2 - i][y] = num
num -= 1
dfs(arr, x + 1, y + 1, num, n - 2)
aaa = int(input())
for aaaa in range(aaa):
n = int(input())
arr = lis(n)
a = dfs(arr, 0, 0, n * n, n)
# 格式化输出print
l = '%4d' * n
for tmp in arr:
print(l % tuple(tmp))
7-4 期末答疑安排 (70 分)
期末安排教师线上答疑,因作息不同,各教师的答疑时间不同,形成如下表格,编写程序当输入星期、小时和分钟,输出对应的答疑教师,如若时间不对,输出“时间错误“,若当时没安排教师则输出“此时无教师答疑”
输入格式:
第一行输入星期 第二行输入小时 第三行输入分钟
输出格式:
输出对应教师或“此时无教师答疑”或“时间错误“
输入样例1:
一
12
34
结尾无空行
输出样例1:
此时无教师答疑
结尾无空行
输入样例2:
二
20
34
结尾无空行
输出样例2:
B
结尾无空行
输入样例3:
一
23
89
结尾无空行
输出样例3:
时间错误
结尾无空行
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 15:46
dic1 = {'一': 'A', '二': 'B', '三': 'C', '四': 'D', '五': 'E'}
dic2 = {'一': 9, '二': 20, '三': 13, '四': 20, '五': 13}
day = input()
h = int(input())
m = int(input())
if day not in dic2 or h > 24 or h < 0 or m >= 60 or (h == 24 and m > 0):
print('时间错误')
else:
if dic2[day] == h:
print(dic1[day])
elif h - dic2[day] == 1 and m <= 30:
print(dic1[day])
else:
print('此时无教师答疑')
7-5 学生成绩分析 (10 分)
输入考试的成绩(可以有小数),求出各分数与平均分的差值绝对值(保留一位小数),输出按差值绝对值从小到大排列的(分数,差值绝对值)列表。
输入格式:
第一行输入同学们的考试成绩,以空格隔开。
输出格式:
输出排好序的(分数,差值绝对值)列表。
输入样例:
66 78 95 63 85 94 99
结尾无空行
输出样例:
[(85, 2.1), (78, 4.9), (94, 11.1), (95, 12.1), (99, 16.1), (66, 16.9), (63, 19.9)]
结尾无空行
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 17:45
str1 = input()
lis1 = list(map(str, str1.split()))
lis = list(map(float, str1.split()))
siv = round(sum(lis) / len(lis), 1)
dic = {}
for i in range(len(lis)):
dic[eval(lis1[i])] = round(abs(siv - lis[i]), 1)
lis1 = sorted(dic.items(), key=lambda x: x[1], reverse=False)
print(lis1)
7-6 空心菱形* (10 分)
请编写程序,输出空心菱形。
输入格式
行数(正整数)
输出格式
若行数为奇数,则显示由星号勾勒出的空心菱形,否则显示错误信息。
输入样例1
5
输出样例1
*
* *
* *
* *
*
输入样例2
8
输出样例2
Error
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 18:01
n = int(input())
if n % 2 == 0:
print('Error')
else:
for q in range(n):
if q == 0 or q == n - 1:
for i in range(n // 2):
print(' ', end='')
print('*', end='')
elif q <= n // 2:
for i in range(n // 2 - q):
print(' ', end='')
print('*', end='')
for i in range(n - (n // 2 - q) * 2 - 2):
print(' ', end='')
print('*', end='')
else:
for i in range(n // 2 - (n - 1 - q)):
print(' ', end='')
print('*', end='')
for i in range(n - (n // 2 - (n - 1 - q)) * 2 - 2):
print(' ', end='')
print('*', end='')
print()
7-7 搬砖 (10 分)
某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法?(注意当某类人数为0时,也是合理的方案)
输入格式:
输入在一行中给出一个正整数n。
输出格式:
直接输出方案的数目。
输入样例1:
45
结尾无空行
输出样例1:
4
结尾无空行
输入样例2:
4
结尾无空行
输出样例2:
0
结尾无空行
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 18:21
n = int(input())
if n < 8 and (n != 3 or n != 5):
print('0')
else:
sum1 = 0
for i in range(n // 5 + 1):
if (n - i * 5) % 3 == 0:
sum1 += 1
print(sum1)
7-8 买玩具 (10 分)
某小学要购置文具。批发市场中A牌的铅笔卖5元一支,C牌的铅笔卖2元一支,D牌的简易铅笔卖1元2只(捆绑销售,只能买偶数只)。如果想用n元买n支笔,问有多少种买法?(注意当某牌的铅笔为0支时,也是合理的方案)
输入格式:
输入在一行中给出一个正整数n。
输出格式:
直接输出方案的数目。
输入样例1:
450
结尾无空行
输出样例1:
51
结尾无空行
输入样例2:
5
结尾无空行
输出样例2:
0
结尾无空行
答案:
# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/12/7 18:45
n = int(input())
if n % 3 != 0:
print('0')
else:
sum1 = 0
for i in range(n // 9 + 1):
if (n - i * 9) % 3 == 0:
sum1 += 1
print(sum1)