星期一和乘积尾零这两道题都是填空题,当然,我们在比赛时可以投机取巧,但是作为练习,我们如何写出完整而清晰的代码一次性run!?
ok,我们先看乘积尾零这道题
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如下的 1010 行数据,每行有 1010 个整数,请你求出它们的乘积的末尾有多少个零?
5650 4542 3554 473 946 4114 3871 9073 90 4329
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211
copy
运行限制
最大运行时间:1s
最大运行内存: 128M
【解题思路】
作为一道填空送分题,啥,你想说不是?你用python,那它就是送分呀!python的超大乘积长度完全能计算出乘积结果! 你可以直接将题目中的所有数字copy下来定义成一个字符串,然后利用python的split()分割函数转化成一个字符数组嘛。最后取数组中每一个字符强制转化成数字,一个一个乘到结果中就得到值了!一个字,easy!
得到值后你可以一个一个数有多少个零,没有毛病。但是我们今天练习就得编程跑出来!啥,麻烦?也很easy! 将结果强转成字符串从后往前检索有多少个零不就可以了吗?如果匹配到不是零,退出循环即可。
接下来请看代码:
#把题目中的数字copy下来定义为字符串
data_str="5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 1486 5722 3135 1170 4014 5510 5120 729 2880 9019 2049 698 4582 4346 4427 646 9742 7340 1230 7683 5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 6701 6645 1671 5978 2704 9926 295 3125 3878 6785 2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 689 5510 8243 6114 337 4096 8199 7313 3685 211 "
data=data_str.split()#分割字符串为字符数组
result_temp=1#用于乘积结果存储的变量
for i in range(len(data)):
result_temp*=int(data[i])#一个一个乘!
result_temp_str=str(result_temp)#现在结果已经出来了,再转化成字符串,方便数零
result_count=0#统计零的个数
index_byBackStrat=len(result_temp_str)-1#从后往前检索的开始下标
while(True):
if "0"==result_temp_str[index_byBackStrat]:#如果等于“0”,则继续检索前一个
result_count+=1
index_byBackStrat-=1
else:#不等于“0”,退出检索循环
break
print(result_count)#输出零的个数
【总结】
大数字计算用python很方便,统计数的类型转化成字符串来匹配十分方便!
【星期一】
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
整个 2020 世纪(1901 年 1 月 1 日至 2000 年 12 月 31 日之间),一共有多少个星期一?(不要告诉我你不知道今天是星期几)
运行限制
最大运行时间:1s
最大运行内存: 128M
【解题思路】
可以用excel和word取巧,但比赛环境不一定有这两个。我们今天编程解决问题!乍一看似乎要用日期API,实则不然。我觉得这就是一个植树问题! 通过日历一查便知开始1901 年 1 月 1 日为星期二,在周一之后便不包含当周周一,结束2000 年 12 月 31 日是周四在周一之后便包含周一。一端有一端没有,棵树等于段数,**求多少个周一就变成了求1901 年 1 月 1 日至 2000 年 12 月 31 日之间有多少个星期!**接下来判断这段时间有多少天算出有多少个星期便可(非整数段必定不包含周一,没有完整的一段怎么会栽树?)
代码简单,请看
day=0
for i in range(1901,2001):
if i%4==0 and i%100!=0 or i%400==0:
day+=366
else:
day+=365
result=day//7
print(result)
【总结】
星期一这道题看似是一道编程题,实则是一道数学题,说明我们在做算法题时也应该利用数学思维



