我试图创建一个函数,其中给定一年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;
}