题目
在国外,每月的 13 号和每周的星期 5 都是不吉利的。特别是当 13 号那天恰好是星期 5时,更不吉利。
现在给你一个年份,请你从小到大依次输出当年所有13 号是星期 5 的月份。思考
看到这道题目,心想这题也太简单了吧。知道我的意思吧,直接用现成的库(针对Python来说),不就可以解决了吗。
当然如何不用现有的库来解决呢?如果我告诉你,公元元年1月1号是星期1(按照现在的历法往前推得话是星期一),那么N天后是星期几,是不是很容易计算了。
- 方法一
import sys
import calendar
for y in sys.stdin:
if not y:break
y = int(y)
#返回给定日期的日期码。0(星期一)到6(星期日)
s = ''
for i in range(1,13):
if calendar.weekday(y,i,13)==4:
s += str(i) + ' '
if s=='':
sys.stdout.write('Luck')
else:
sys.stdout.write(s.strip())
sys.stdout.write('\n')
- 方法二
import sys
#Leap Year or Not Leap Year
m1 = [0,31,28,31,30,31,30,31,31,30,31,30,31]
m2 = [0,31,29,31,30,31,30,31,31,30,31,30,31]
#存储I月之前的前(I-1)个月的和
for i in range(1, 13):
m1[i] += m1[i-1]
m2[i] += m2[i-1]
for y in sys.stdin:
if not y:break
y = int(y)
#获取y年之前的天数
dd = 365*((y-1) + (y-1)/4 - (y-1)/100 + (y-1)/400)
#判断该年是不是闰年
flag = y%400==0 or (y%100!=0 and y%4==0)
s = ''
for i in range(1,13):
#if leap year
d = m2[i-1] if flag else m1[i-1]
if (dd + d + 13)%7==5:
s += str(i) + ' '
#output
if s=='':
sys.stdout.write('Luck')
else:
sys.stdout.write(s.strip())
sys.stdout.write('\n')
- 后话
我看到有人分析道,是说每年的要么是闰年要么不是,每年的第一天也就第一种情况。换句话说,就是不求之前年份的天数和,而是直接用库函数来获取第一天是星期几,这样也可以。个人推荐方法二,偷懒的可以用方法一。