我试图创建一个函数,其中给定一年year > 1999,它返回一个值0到6,其中Sunday = 0, Monday = 1 ... Saturday = 6对应于11月1日所在的一周中的某一天。因为我知道2000年11月1日是3号(星期三),所以我把它当作NOV1我知道我必须记住闰年,所以我有一个if声明,这会有帮助我不知道为什么它在2100年以后不能正常工作救命啊!

public static int firstOfMonth(int year)
{
  int raw = year - 2000;
  int leapYears = raw / 4;
  int nonLeapYears = 0;
  if ( raw >= 100 )
  {
    nonLeapYears = raw / 100;
    leapYears = leapYears - ( nonLeapYears - ( nonLeapYears / 4 ) );
  }
  else
  {
    nonLeapYears = 0;
  }
  return ((( NOV1 + ( raw * 365 ) - leapYears) ) % 7 );
}

同样,NOV1=3

最佳答案

这个问题似乎是因为您在返回语句中减去闰年,而不是添加闰年。
像这样的错误之所以会发生并且很难被注意到,部分原因是周围的代码变得过于复杂。当您简化代码时,更容易看到哪里出错了。
例如,整个代码块:

int leapYears = raw / 4;
int nonLeapYears = 0;
if ( raw >= 100 )
  {
    nonLeapYears = raw / 100;
    leapYears = leapYears - ( nonLeapYears - ( nonLeapYears / 4 ) );
  }
  else
  {
    nonLeapYears = 0;
  }

可以简化为:
int leapYears = int(raw/4) - int(raw/100) + int(raw/400);

这是每四年减去可以被100整除的年份,也可以被400整除的年份。有道理?
一旦你有了已经过去的闰年数,计算2000年11月1日以来的天数应该简单到:
365 * raw + leapYears;

因为闰年有366天,所以你必须增加闰年的额外天数。因此,您的报税表应为:
return ( NOV1 + 365 * raw + leapYears ) % 7;

最后,你应该有这样的东西:
public static int firstOfMonth(int year)
{
    int raw = year - 2000;
    int leapYears = int(raw/4) - int(raw/100) + int(raw/400);
    return ( NOV1 + 365 * raw + leapYears ) % 7;
}

09-05 23:43