PAT乙级-不吉利的日期

33 篇文章 0 订阅
1 篇文章 0 订阅
  • 题目

    在国外,每月的 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')
  • 后话

我看到有人分析道,是说每年的要么是闰年要么不是,每年的第一天也就第一种情况。换句话说,就是不求之前年份的天数和,而是直接用库函数来获取第一天是星期几,这样也可以。个人推荐方法二,偷懒的可以用方法一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值