我正在尝试创建一个函数,给定年份 year > 1999
它返回一个 0 到 6 的值,其中 Sunday = 0, Monday = 1 ... Saturday = 6
对应于 11 月的第一天所在的星期几。因为我知道 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
最佳答案
问题的出现似乎是因为您在 return 语句中减去闰年而不是添加闰年。
这样的错误之所以会发生并且很难被注意到,部分原因是周围的代码变得过于复杂。简化代码后更容易看出问题出在哪里。
例如,整个代码块:
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;
}
关于java - 星期功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27218087/