Python蓝桥杯基础之星期一

星期一

整个20世纪(1901年1月1日至2000年12月31日之间),一共有多少个星期一?(不要告诉我你不知道今天是星期几)

我们可能不知道20世纪中的某一天是星期几,但我们应该知道今天是星期几。 比如说今天是2022年10月19日星期三,我们只需要反推到二十多年前的2000年12月31日是星期几就科研进行计算了。

#  已知2022年为平年2月28天,所以可知10月19日为这一年的第292天,所以在291天前为本年的1月1日
n = 291
while n > 7:
    for i in range(1, 1000):
        n = n - 7
        if n < 7:
            break
print(n)   #  即2022年1月1日的4天后为星期三即1月5日为星期三
week_2022_1_1 = 7 + 3 - 4  #  用来计算星期几的,减出来为负数就在前面加个7答案就是星期几
print(week_2022_1_1)
#  所以说2022年的1月1日是星期六,2021年12月31日是星期五
day_to_2000_12_31 = 366 * 5 + 365 * 16
print(day_to_2000_12_31)
# 即在2021年12月31日的7670天前是2000年12月31日
n = 7670
while n > 7:
    for i in range(1, 1000):
        n = n - 7
        if n < 7:
            break
print(n)
#  21年前的2000年12月31日的5天后为星期五,所以2000年12月31日是星期日
day_to_1901_1_1 = 366 * 25 + 365 * 75 - 1 # 这里为什么要减一天?
print(day_to_1901_1_1)
# 即在2000年12月31日的36524天前是1901年1月1日
n = 36524
while n > 7:
    for i in range(1, 10000):
        n = n - 7
        if n < 7:
            break
print(n)
#  1901年1月1日的5天后为星期日,所以1901年1月1日是星期二

上面代码中的

n = 291
while n > 7:
    for i in range(1, 1000):
        n = n - 7
        if n < 7:
            break
print(n)

这些部分都可以直接写成n % 7效果是一样的

还有就是day_to_1901_1_1 = 366 * 25 + 365 * 75 - 1 # 这里为什么要减一天?

这是因为1900年12月31日才是2000年12月31日的整整一百年前,而1901年1月1日还少一天,注意我这里算的是多少天以前,而不是这段时间总共有多少天。如果算1901年1月1日到2000年12月31日总共有多少天那就是整整100年,不需要减1。

上面的代码块是我一 步一步推的,当然可以直接得到2000年12月31日是星期几然后再进行计算,我们最终要得到的是20世纪有多少个星期一,先得到1901年1月1日到2000年12月31日有多少个7天,剩下的再做计算即可,代码入如下:

print(day_to_1901_1_1 // 7, day_to_1901_1_1 % 7)
#  已知1901年1月6日为星期日, 所以五天前的1901年1月1日为星期二
#  所以正确答案就是(day_to_1901_1_1 // 7)即5217个星期一, 不用管后面的余数5

上面的解法思路非常简单,当然看起来有点麻烦,我们可以将其简单化一点,如下代码:

day_num = 0
for year in range(1901, 2001):
    if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
        day_num += 366
    else:
        day_num += 365
day_before = day_num - 1  # 这里为什么减1如我上文所说。
# 现在只需要1901年1月1日是星期几,或是2000年12月31日是星期几就可以算出共有多少个星期一
# 这里我们只知道今天是2022年10月19日星期三,所以需要去往回推算
# 如上算出
#  已知2022年为平年2月28天,所以可知10月19日为这一年的第292天,所以在291天前为本年的1月1日
n = 291
day_to_2000_12_31 = 366 * 5 + 365 * 16 + n + 1  # 这里+1是因为整年是到2021年12月31日为21年少1月1日1天
# 即在2022年10月19日的7962天前是2000年12月31日
n = 7962
yu = n % 7
week_2000_12_31 = 3 - yu + 7

yu_result = day_before % 7
week_1901_1_1 = 7 - yu_result
#  所以1901年1月1日为星期二
sumMon = day_before // 7
print(sumMon)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

My_YueR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值