Java 我的密码和幸运答案有误

Java 我的密码和幸运答案有误,java,Java,剧透警报!!关于欧拉计划问题19 问题是从1901年到2000年,每月的第一天有多少个星期天。已知信息:1900年1月1日是星期一,1月和3月等有31天,4月、6月等有30天,闰年发生在任何一年,可以被4整除,但除非可以被400整除,否则不会发生在一个世纪。在这种情况下,适用于2000年 我得到了正确的答案,但当我用一个真正的日历检查结果时,结果发现我的代码正在计算星期六。我不明白为什么会这样,有人能帮忙吗 public class Sunday { public static void ma

剧透警报!!关于欧拉计划问题19

问题是从1901年到2000年,每月的第一天有多少个星期天。已知信息:1900年1月1日是星期一,1月和3月等有31天,4月、6月等有30天,闰年发生在任何一年,可以被4整除,但除非可以被400整除,否则不会发生在一个世纪。在这种情况下,适用于2000年

我得到了正确的答案,但当我用一个真正的日历检查结果时,结果发现我的代码正在计算星期六。我不明白为什么会这样,有人能帮忙吗

public class Sunday {

public static void main(String[] args) {

    int sundayCount = 0;
    int currentday = 0; // monday is 0, sunday will be 6
    int dayLimit = 0;

    for (int year = 1900; year < 2001; year++) {
        for (int month = 1; month < 13; month++) {
            // 30 days April, June, September, November
            if (month == 4 || month == 6 || month == 9 || month == 11)
                dayLimit = 30;

            // leap year
            else if (month == 2 && year % 4 == 0)
                dayLimit = 29;

            // February not leap year
            else if (month == 2 && year % 4 != 0)
                dayLimit = 28;

            // Jan, March, May, July, August, October, December
            else
                dayLimit = 31;
            for (int day = 1; day <= dayLimit; day++) {
                if (day == 1 && currentday == 6 && year > 1900) {
                    System.out.println("year: " + year);
                    System.out.println("month: " + month);
                    sundayCount++;
                }
                if (currentday < 6)
                    currentday++;
                else
                    currentday = 0;
            }
        }
    }
    System.out.println(sundayCount);
}
}
周日公共课{
公共静态void main(字符串[]args){
int sundayCount=0;
int currentday=0;//周一为0,周日为6
int dayLimit=0;
对于(整数年=1900;年份<2001;年份++){
对于(整数月=1;月<13;月++){
//30天4月、6月、9月、11月
如果(月==4 | |月==6 | |月==9 | |月==11)
日限=30;
//闰年
否则如果(月份==2和年份%4==0)
日限=29;
//二月不是闰年
否则如果(月==2年和年%4!=0)
日限=28;
//一月、三月、五月、七月、八月、十月、十二月
其他的
日限=31;
对于(整数天=1;1900天){
系统输出打印项次(“年:+年);
System.out.println(“月:+月”);
sundayCount++;
}
如果(当前日期<6)
currentday++;
其他的
currentday=0;
}
}
}
系统输出打印项次(星期日计数);
}
}

您忘记在代码中添加检查1900年2月应该有29天还是28天。因为1900年不是闰年,所以1900年不应该有29天

else if (month == 2 && year % 4 == 0 && year != 1900)
    dayLimit = 29;

// February not leap year
else if (month == 2)
    dayLimit = 28;

这应该可以解决问题。

你难道没有忘记1900年不是代码中的闰年吗?除了Astor给出的答案之外,你有没有考虑到1900年1月1日实际上是星期一这一事实?@GeorgeTomlinson 1900年1月1日是星期一@GeorgeTomlinson代码已经检查了第一个年份%4==0,如果月份是2,则检查其他年份。如果返回false,则检查月份是否为2的第二个检查在默认情况下应为年份%4>0。所以第二个检查是多余的。这实际上需要我们在第二张支票上再加一张1900美元的支票,否则的话。谢谢你把它修好了!