2020年4月11日 星期六

[C_MM219-中] 黑色星期五

[C_MM219-中] 黑色星期五

成績: 0 / 倒扣: 0.8

問題描述 :
「黑色星期五」被認為是不吉利的日子,有一家保險公司想藉由「黑色星期五」及「2012世界末日」來當噱頭,因此保險公司想要設計一個長達數年的計畫,但他們必須先知道這數年中會出現幾次「黑色星期五」。
※提示:(西元年是400的倍數)或(西元年是4的倍數但不是100的倍數)就是閏年。

Y(year):年份減2000

L(leap days):從2000年1月1日到該日之間的閏日數目

M(month):月份的代號,從一月到十二月分別是5、1、1、4、6、2、4、0、3、5、1、3,即是一月是5,二、三月是1,四月是4,五月是6,依此類推,十二月是3

D(date):日號

星期 = (Y + L + M + D) mod 7

如2008年12月10日

​(8 + 3 + 3 + 10) mod 7 = 3,即該日是星期三。
輸入說明 :
輸入兩筆西元年,中間以一個逗點隔開。 (西元年區間為0 ~ 2012,請依小到大輸入)
輸出說明 :
輸出兩筆西元年之間共發生幾次黑色星期五。
範例 :

輸入範例輸出範例
1970,197510

def Runnian(y):# y年是否為閏年
    return True if y % 400 == 0 or(y % 4 == 0 and y % 100 !=0) else False
def Count_R(y):
    r = 0
    if y >= 2000:
        for i in range(2000, y+1):
            if Runnian(i):
                #print(i)
                r += 1
    else:
        for i in range(y, 2000):
            if Runnian(i):
                #print(i)
                r += 1
    return r
m, n = map(int,input().split(','))
M = [5, 1, 1, 4, 6, 2, 4, 0, 3, 5, 1, 3]
days = 0
for y in range(m, n+1):
    Y = y - 2000
    r = Count_R(y)
    if y >= 2000:
        for m in range(1, 13):
            if Runnian(y):
                L = r if m > 2 else r - 1
                if (Y + L + M[m-1] + 13) % 7 == 5:
                    #print('%d 月 13 日' % m)
                    days += 1
            else:
                L = r
                if (Y + L + M[m-1] + 13) % 7 == 5:
                    #print('%d 月 13 日' % m)
                    days += 1
    else:
        for m in range(1, 13):
            if Runnian(y):
                L = r - 1 if m > 2 else r
                if (Y - L + M[m-1] + 13) % 7 == 5:
                    #print('%d 月 13 日' % m)
                    days += 1
            else:
                L = r
                if (Y - L + M[m-1] + 13) % 7 == 5:
                    #print('%d 月 13 日' % m)
                    days += 1
print(days)
  

沒有留言:

張貼留言