Алгоритм логики c - подсчет воскресений - PullRequest
1 голос
/ 09 января 2020

Я написал фрагмент кода, который подсчитывает, сколько раз воскресенье выпадает на первое число месяца с января 1901 года по декабрь 2000 года (включительно). Я знаю, что правильный ответ - 171, что на один больше, чем я получаю. Это означает, что либо в логе моего алгоритма c имеется ошибка, либо я неправильно понимаю формулировку проблемы. Я надеялся, что кто-нибудь укажет на мою ошибку в любом случае. Вот формулировка проблемы и мой код:

1 января 1900 года был понедельник. Тридцать дней сентябрь, апрель, июнь и ноябрь. У всех остальных тридцать один, спасительный февраль, в котором двадцать восемь, дождь или сияние. В високосные годы - двадцать девять.

В любой високосный год наступает високосный год, делимый на 4, но не на столетие, если он не делится на 400.

Сколько выпало воскресений первое число месяца в двадцатом веке (с 1 января 1901 по 31 декабря c 2000)?

monthdict = {
    1: 31,
    2: 28,
    3: 31, 
    4: 30,
    5: 31,
    6: 30,
    7: 31,
    8: 31,
    9: 30,
    10: 31,
    11: 30,
    12: 31
}

ly_monthdict = {
    1: 31,
    2: 29,
    3: 31, 
    4: 30,
    5: 31,
    6: 30,
    7: 31,
    8: 31,
    9: 30,
    10: 31,
    11: 30,
    12: 31
}

leap_year = False
sundays = 0
first_sunday = 6

for year in range(1901, 2001):
    if year % 4 == 0 and year % 100 != 0:
        leap_year = True
    elif year % 100 == 0 and year % 400 == 0:
        leap_year = True
    else:
        leap_year = False

    if leap_year:
        for month in range(1, 13):
            if first_sunday == 1:
                sundays += 1

            curr_sunday = first_sunday
            while curr_sunday < ly_monthdict[month]:
                curr_sunday += 7

            first_sunday = curr_sunday - ly_monthdict[month]


    else:
        for month in range(1, 13):
            curr_sunday = first_sunday
            while curr_sunday < monthdict[month]:
                curr_sunday += 7

            first_sunday = curr_sunday - monthdict[month]
            if first_sunday == 1:
                sundays += 1

print(sundays, "Sundays occured on the first of the month")

1 Ответ

1 голос
/ 09 января 2020

выглядит глупо, но оба ваших внутренних блока for..in не одинаковы.

Если вы переместите проверку if first_sunday == 1 в начало l oop для не високосных лет, вы получите 171 в качестве ответа.

if leap_year:
    for month in range(1, 13):
        if first_sunday == 1:
            sundays += 1
        curr_sunday = first_sunday
        while curr_sunday < ly_monthdict[month]:
            curr_sunday += 7
        first_sunday = curr_sunday - ly_monthdict[month]
else:
    for month in range(1, 13):
        if first_sunday == 1:     #Moved this block up
            sundays += 1
        curr_sunday = first_sunday
        while curr_sunday < monthdict[month]:
            curr_sunday += 7
        first_sunday = curr_sunday - monthdict[month]

Также спасибо ProjectEuler, я не решал эти проблемы более десяти лет. Я предлагаю вам объединить оба этих цикла и переключиться на ссылку, которую dict вы используете вместо дублирования кода.

...