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)

你可能感兴趣的:(Python基础,蓝桥杯_基础,蓝桥杯,python,算法)