解答:作为填空题第一题,难度比较低,暴力查2即可。
cnt = 0
for i in range(1,2021):
for j in str(i):
if j == '2':
cnt = cnt + 1
print(cnt) # 624
第二题:既约分数
题解:这个题我想到的办法就是暴力解决,生成1到2020的分母和1到2020的分子,看一看是不是最大公约数是不是为1,然后利用python本地库fraction进行分数相似性判断(看看是不是分数相等)。需要注意的是,暴力法python计算很慢。(反正是填空题,咱们先做下一道)
from fractions import Fraction
def gong_yue(m, n):
if m > n:
sm = n
else:
sm = m
for i in range(1, sm + 1):
if m % i == 0 and n % i == 0:
hcf = i
return hcf
target_lst = []
for i in range(1, 2021):
for j in range(1, 2021):
if gong_yue(i, j) == 1 and Fraction(i, j) not in target_lst:
target_lst.append(Fraction(i, j))
print(len(target_lst))
实在想不起来python这个本地库的内容了,在idle上按F1打开帮助文档救急
第三题:蛇形填数
题解:我们不难看出1行1列数在1这个数组中,第2行第2列的数在第456数组中的中间位置,第三行第三列在11,12,13,14,15这个数组中的中间位置。我们按条斜线为一个数组,不难看出第n行n列就在等差数列数组1,3,5,7~~~中,即为第39个数组,我们先生成一个类似于[[1],[2,3],[4,5,6],[7,8,9,10]~~~]这样的形式代表一条斜线上的数字,第39条斜线数组即为位置为38位置的数组(从0开始算),这个数组内元素个数一定为奇数为29,那中间的位置为第15号(即为14号位置的元素),后边比较坑。
cnt = 1
num = 0
all_lst = []
lst = []
for i in range(1, 10000):
lst.append(i)
num = num + 1
if cnt == num:
all_lst.append(lst)
lst = []
cnt = cnt + 1
num = 0
# 20行20列对应在第39次循环中
print(all_lst[38][14])
# 756
第四题:跑步训练
题解:这个题我做起来比较麻烦,要时刻不断地维护四个变量月中第n天,月份,星期,年。关系比较复杂,中间还穿插有闰年等东西,做题是要集中注意力,理清楚几个变量之间的关系,有个小技巧就是在运行工程中穿插print函数打印当前的一些数据,我们便能够轻松观察到问题出现在哪个地方,便可以快速解决。还有,在已经写完的代码上加上注释,看似麻烦其实大大减轻了我们的思考强度。
def run(n):
if n % 4 == 0:
return True
else:
return False
run_day = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
ping_day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
start_year = 2000 # 记录年份
cnt_mon = 0 # 记录年中第几月
month_day = 1 # 记录月中第几天
cnt = 6 # 记录星期几
distance = 0 # 记录距离
while True:
if cnt == 1 or month_day == 1: # 判断当前距离
distance = distance + 2
else:
distance = distance + 1
if start_year == 2020 and cnt_mon == 9 and month_day == 1:
break
if cnt == 7: # 判断星期,进行星期迭代
cnt = 1
else:
cnt = cnt + 1
if run(start_year):
if month_day == run_day[cnt_mon]: # 闰年月份增加
month_day = 1
cnt_mon = cnt_mon + 1
else: # 闰年日期增加
month_day = month_day + 1
else:
if month_day == ping_day[cnt_mon]: # 平年月份增加
month_day = 1
cnt_mon = cnt_mon + 1
else: # 平年日期增加
month_day = month_day + 1
if cnt_mon == 12: # 年份增加
start_year = start_year + 1
cnt_mon = 0
print(distance) # 8879
第五题:七段码
题解:啊这个,还没学过。感觉有点像回溯。
第六题: 成绩统计
题解:这道题比较简单没什么说的
num = int(input())
chengji_lst = []
good = 0
normal = 0
for i in range(num):
c = int(input())
if c >= 85:
good = good + 1
if c >= 60:
normal = normal + 1
normal_range = normal / num * 100
good_range = good / num * 100
a = normal_range - int(normal_range)
b = good_range - int(good_range)
if a >= 0.5:
normal_range = int(normal_range) + 1
else:
normal_range = int(normal_range)
if b >= 0.5:
good_range = int(good_range) + 1
else:
good_range = int(good_range)
print(str(normal_range) + '%')
print(str(good_range) + '%')
第七题:回文日期
解题思路:这个题我认为跟上边的跑步锻炼那个题差不多,部分代码复制一下就可以解决这个问题
def run(n):
if n % 4 == 0:
return True
else:
return False
run_day = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
ping_day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
data = input()
year = int(data[0:4])
month = int(data[4:6])
day = int(data[6:])
status = []
hashmap = {}
while True:
if run(year):
if day == run_day[month - 1]:
day = 1
month = month + 1
else:
day = day + 1
else:
if day == ping_day[month - 1]:
day = 1
month = month + 1
else:
day = day + 1
if month == 13:
year = year + 1
month = 1
str_month = str(month)
str_day = str(day)
if len(str(month)) == 1:
str_month = '0' + str(month)
if len(str(day)) == 1:
str_day = '0' + str(day)
ge_shi = str(year) + str_month + str_day
if ge_shi == ge_shi[::-1]:
if 'a' not in status:
hashmap['normal'] = ge_shi
status.append('a')
if ge_shi[0:2] == ge_shi[2:4] and ge_shi[7:5:-1] == ge_shi[5:3:-1] and ge_shi[0:2] == ge_shi[7:5:-1]:
hashmap['ab'] = ge_shi
break
print(hashmap['normal'])
print(hashmap['ab'])
第八题:子串分值和
题解:利用集合的特性
a = input()
long = len(a)
head = 0
tail = 1
s = 0
while True:
s = len(set(a[head:tail])) + s
if tail == long:
head = head + 1
tail = head + 1
else:
tail = tail + 1
if head == long:
break
print(s)
第九题:平面切分
后边这两道实在做不出来