问题描述
我一直试图理解为什么以下代码仅在起始年份设置为1900时才给出正确的答案。问题表明星期日应该从1901年1月1日开始计算。
我以为我意识到没有零年,所以1900实际上是1901 ...但是在将while循环从2000年调整为1999年时,这没用。
我完全为为什么使用错误的开始年份给出正确答案感到困惑。
public class Euler19
{
public static void main(String[] args)
{
int day = 2; //Jan 1st,1901 is a Tuesday,This should be 3 but only works if set to 2 for Monday
int sundays = 0;
int month = 1;
int monthDays = 1;
int year = 1901;
while(year <= 2000)
{
switch(month) //Case for each month
{
case 1: //January
if(monthDays == 31)
{
month++;
monthDays = 1;
}
break;
case 2: //February
if((year % 4 == 0) && (year != 1900)) //Leap days
{
if(monthDays == 29)
{
month++;
monthDays = 1;
}
}
else
{
if(monthDays == 28)
{
month++;
monthDays = 1;
}
}
break;
case 3: //march
if(monthDays == 31)
{
month++;
monthDays = 1;
}
break;
case 4: //April
if(monthDays == 30)
{
month++;
monthDays = 1;
}
break;
case 5: //May
if(monthDays == 31)
{
month++;
monthDays = 1;
}
break;
case 6: //June
if(monthDays == 30)
{
month++;
monthDays = 1;
}
break;
case 7: //July
if(monthDays == 31)
{
month++;
monthDays = 1;
}
break;
case 8: //August
if(monthDays == 31)
{
month++;
monthDays = 1;
}
break;
case 9: //September
if(monthDays == 30)
{
month++;
monthDays = 1;
}
break;
case 10: //October
if(monthDays == 31)
{
month++;
monthDays = 1;
}
break;
case 11: //November
if(monthDays == 30)
{
month++;
monthDays = 1;
}
break;
case 12: //December
if(monthDays == 31)
{
month = 1;
monthDays = 1;
year++;
}
break;
}
if(day == 1 && monthDays == 1) //Sunday is 1st day of the week
{
sundays++;
}
if(day == 7)
{
day = 0;
}
day++;
monthDays++;
}
System.out.println("Total Sundays: " + sundays);
}
}
解决方法
您的错误在其他地方:您的程序正在跳过每月的第一天。在使用错误的开始年份时碰巧获得了正确的结果,这完全是巧合。
从1900年1月1日星期一开始(无论那天是否真的是星期一),您一直在正确地计数到1月,并认为1月31日是星期三。到目前为止,前提条件是正确的。随之而来的麻烦是:由于month
为1且monthDays
为31,因此您在monthDays
语句中将month递增为2并将switch
设置为1。在您的switch
和两个if
语句之后,您将day
(正确)和递增 monthDays
递增到2,这将导致错误值。现在,您有了1900年2月2日,星期四,与1月31日是星期三不同。
每次新月开始,都会出现相同的错误增量。
我建议您学习使用调试器。这将使您能够自行查找此类错误。
,所以您的问题是您的范围,现在从1900到2000(不包括),应该是1901到2000(包括)。简而言之,答案是您需要将while循环更改为while(year<=2000)