2015-09-01 2 views
0

Можно ли рассчитать, сколько понедельников 1-го числа между двумя датами?Рассчитать, сколько понедельников 1-го числа между двумя датами

Я написал две функции, чтобы найти, сколько дней между двумя датами, с помощью C++:

int rdn(int y, int m, int d) { 
    if (m < 3) { y--, m += 12; }; 
    return 365*y + y/4 - y/100 + y/400 + (153*m - 457)/5 + d - 306; 
} 

int days = rdn(2015, 01, 01) - rdn(2015, 12, 31); 

И с помощью Python:

def days_between(d1, d2): 
    d1 = datetime.strptime(d1, "%Y-%m-%d") 
    d2 = datetime.strptime(d2, "%Y-%m-%d") 
    return abs((d2 - d1).days) 

print(days_between('2015-01-01', '2015-12-31')) 

Но я не понимаю, как обновить свою функцию для расчета понедельника 1-го.

+1

Что вы пробовали? Существуют постоянные календари (https://en.wikipedia.org/wiki/Perpetual_calendar), которые вы могли бы использовать. Разве это не вопрос их подсчета? – skyking

+0

Если вы знаете, какой именно день недели является первым января, то определение дня недели для любой даты тривиально. На самом деле, если вы знаете * любой * рабочий день в текущем году, тривиально вычислять будний день в любой другой день в этом году. Вы можете легко распространить это на любое количество лет в прошлое или будущее. См. Http://www.mischel.com/diary/2005/08/08.htm. –

+1

Я голосую, чтобы закрыть этот вопрос как вне темы, потому что это постоянное соревнование по программированию: https://www.hackerrank.com/contests/w17/challenges/count-fridays-the-13thth, где решения будут быть доступным через 7 дней. Человек не заботится о знании, а только о получении очков. –

ответ

2

Этот алгоритм является цикл, который исследует будний день 1-го числа каждого месяца с даты начала (включительно) до даты окончания (включительно), и считает те, которые падают на понедельник:

import datetime 

def num_monday_the_first_between(start, end): 
    y, m, d = start.year, start.month, 1 
    count = 0 
    while (y, m, d) <= (end.year, end.month, end.day): 
     if datetime.date(y, m, d).isoweekday() == 1: 
      count += 1 
     m += 1 
     if m == 13: 
      m = 1 
      y += 1 
    return count 


print(num_monday_the_first_between(datetime.date(2015,1,1), datetime.date(2015,12,31))) 
# Result: 1 (June) 
+0

хороший прямой ответ :) даже если он не самый короткий, это может быть –

+0

Спасибо. Мне бы хотелось узнать, какие умные алгоритмы существуют. – Nayuki

+0

Пожалуйста, удалите ответ, потому что этот вопрос связан с продолжающимся программированием. –

Смежные вопросы