第一题:门牌制作
解答:作为填空题第一题,难度比较低,暴力查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)
第九题:平面切分
后边这两道实在做不出来
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)