java项目Euler#19,答案只有在1900年开始时才正确?
我一直在试图理解为什么下面的代码只在起始年设置为1900时给出正确答案。该问题规定,周日应从1901年1月1日开始计算
我想当我意识到没有0年的时候我就知道了,所以1900年实际上是1901年。。。但当调整2000年到1999年的while循环时,这并没有起作用
我完全震惊于为什么这给出了正确的答案,使用了错误的开始年份
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);
}
}
# 1 楼答案
你的错误在别处:你的程序跳过每个月的第一个。当使用错误的起始年份时,您碰巧得到了正确的结果,这完全是巧合
从1900年1月1日星期一开始(无论那一天是否真的是星期一),你正确地计算到1月,并将1月31日视为星期三。到目前为止,这是正确的前提。然后麻烦来了:因为}增加到2,这会给出一个不正确的值。现在是1900年2月2日,星期四,这与1月31日是星期三不一致
month
是1,而monthDays
是31,所以在switch
语句中将month递增为2,并将monthDays
设置为1。在switch
和两个if
语句之后,您将day
(正确)和将{每次新月份开始时,都会发生相同的错误增量
我建议你学习使用调试器。这将使您能够自己查找此类错误
# 2 楼答案
所以你的问题是你的范围,现在它从1900年到2000年不包括在内,应该是1901年到2000年包括在内。简而言之,答案是您需要将while循环更改为
while(year<=2000)