计算日期时的无限循环

Mar*_*jus 2 c++ for-loop infinite-loop

我正在努力解决问题,要求在1990年+ N-1年的每个工作日发现第13天发生了多少次.

int weekDay = 1;
int week[] = {0,0,0,0,0,0,0};

N = 20;

for (int year = 1990; year <= 1990+N-1; year++){
    for (int month = 1; month <= 12; month++){
        int days = numberOfDays(year,month);

        for (int day = 1; day <= days; day++){
            if (day == 13)
                week[weekDay] += 1;

            weekDay += 1;
            if (weekDay > 7)
                weekDay = 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案,但是我在一年中陷入无限循环,似乎无法修复它.

编辑:numberOfDays函数.

int numberOfDays(int year, int month)
{
    if (month == 2 && leapYear(year))
        return 29;
    else if (month == 2)
        return 28;

    if (month == 9 || month == 4 || month == 6 || month == 11)
        return 30;

    return 31;
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 5

您正在使用1..7范围内的工作日,但直方图数组week[]的索引编号为0..6.


一种可能的解决方案 - 更改

            week[weekDay] += 1;
Run Code Online (Sandbox Code Playgroud)

至:

            week[weekDay - 1] += 1;
Run Code Online (Sandbox Code Playgroud)

另一个解决方案 - 使week[]一个元素变大,不要使用元素0,即更改:

int week[] = {0,0,0,0,0,0,0};
Run Code Online (Sandbox Code Playgroud)

至:

int week[] = {0,0,0,0,0,0,0,0};
Run Code Online (Sandbox Code Playgroud)

第三种可能的解决方案 - 使用0..6范围内的工作日,即更改:

int weekDay = 1;
Run Code Online (Sandbox Code Playgroud)

至:

int weekDay = 0;
Run Code Online (Sandbox Code Playgroud)

并改变:

        if (weekDay > 7)
            weekDay = 1;
Run Code Online (Sandbox Code Playgroud)

至:

        if (weekDay > 6)
            weekDay = 0;
Run Code Online (Sandbox Code Playgroud)