【问题标题】:infinite loop while counting dates计算日期时的无限循环
【发布时间】:2011-07-12 20:53:30
【问题描述】:

我正在尝试解决问题,该问题要求找出 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;
        }
    }
}

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

编辑: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;
}

【问题讨论】:

  • 你也可以发布 numberOfDays 函数吗?如果它改变年份或 N,它可能是解释。
  • 是什么让您认为您的问题在于“年”循环而不是其他问题? ...我猜这与您的 numberOfDays() 函数有关。
  • 更喜欢预增量而不是后增量和构造函数初始化而不是赋值,否则 Paul 涵盖了您的问题之一。数组从索引 0 开始。int week[7]; 具有 week[0] 到 week[6] 元素。

标签: c++ for-loop infinite-loop


【解决方案1】:

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


一种可能的解决方案 - 改变:

            week[weekDay] += 1;

到:

            week[weekDay - 1] += 1;

另一种解决方案 - 将 week[] 增大一个元素并且不使用元素 0,即更改:

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

到:

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

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

int weekDay = 1;

到:

int weekDay = 0;

并改变:

        if (weekDay > 7)
            weekDay = 1;

到:

        if (weekDay > 6)
            weekDay = 0;

【讨论】:

    【解决方案2】:

    一个接一个。您的 week[] 数组有 7 个元素,索引为 0..6。你写信给week[7],它会覆盖你不想要的东西,例如year 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-16
      • 2019-09-16
      • 1970-01-01
      • 2020-01-20
      • 2013-09-06
      • 2018-09-22
      • 1970-01-01
      • 2015-01-06
      相关资源
      最近更新 更多