星期几功能不起作用

时间:2014-11-30 20:49:46

标签: java algorithm dayofweek

我尝试创建一个函数,其中给定一年year > 1999并返回值0到6,其中Sunday = 0, Monday = 1 ... Saturday = 6对应于第一天的第一天十一月开始了。由于我知道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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我认为你的代码工作到2400年。你需要检查一年是否可以被400整除 - 那么它是闰年......