欧拉#19真的有效吗?

时间:2015-07-03 10:11:22

标签: java

我正在使用Project Euler#19,我想知道我的代码是如何工作的。

  

项目欧拉#19

     

您将获得以下信息,但您可能更愿意这样做   为自己研究。

     
      
  • 1900年1月1日是星期一。
  •   
  • 九月有三十天了   四月,六月和   十一月。
      其余的都有三十一,
      仅拯救二月,
      其中有二十八,风雨无阻   在闰年,二十九岁。
  •   
  • 闰年发生在任何一年可被4整除,但不能在a上整除   世纪,除非它可以被400整除。
  •   
     

在二十世纪的第一个月(1901年1月1日至12月31日),有多少个星期日下降   2000)?

我的代码:

static int weekday = 1;
static int sundays = 0;
static int years = 1901;
static int[] monthArray = {31, 29, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

public static void solve() {

    for (int yr = years; yr <= 2000; yr++) {
        for (int j = 0; j < 12; j++) {

            if (j != 1) {
                months(monthArray[j]);
            } else {
                if(yr % 4 == 0 && yr % 400 != 0) {
                    months(monthArray[1]);
                } else {
                    months(monthArray[2]);
                }
            }
        }
    }

    System.out.println(sundays);

}

public static void months(int monthLength) {
    for (int i = 0; i <= monthLength; i++) {

        if (weekday == 7 && i == 1) {
            sundays++;
        }

        if (weekday == 7) {
            weekday = 0;
        }

        weekday++;
    }
}

我以为我必须把&#34; j ++&#34;进入闰年所以代码将在下一个月跳过数组。另一件事是我想知道为什么我不能开始这几个月的时间&#39;方法的循环和工作日来自1.这是否有一些代码可以从其他时间跨度可靠地计算周日?我得到了所要求的时间跨度的正确答案,但我不确定它是否真的有效。感谢。

编辑:我更改了代码,以便for循环使用&#39; j&#39;使用不在数组中的异常线性地迭代几个月。仍然没有100%确定它是否正确,但它看起来更合乎逻辑。

public static void solve() {

    for (int yr = years; yr <= 2000; yr++) {
        for (int j = 0; j < 12; j++) {

            if (yr % 4 == 0 && yr % 400 != 0 && j == 1) {
                months(29);
            } else {
                months(monthArray[j]);
            }
        }
    }

    System.out.println(sundays);

}

public static void months(int monthLength) {
    for (int i = 0; i < monthLength; i++) {

        if (weekday == 7 && i == 1) {
            sundays++;
        }

        if (weekday == 7) {
            weekday = 1;
        } else {
            weekday++;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我不想给予太多,因为这个网站涉及个人研究而被卡住是游戏的一部分(尝试另一个挑战,回来......你会更清楚地看到事情)

一种方法就是这样:

counter is 0
day_counter start on a monday
for every years between 1900 and 2000:
    for each months in that year:
        add month's number of day modulo 7 to day_counter
        if 7 divide day_counter:
            increment counter

at the end, counter is your solution.

答案 1 :(得分:0)

我在JS中的代码:

var sunday=0;
for (var year = 1901; year <= 2000; year++) {
    for (var month = 1; month <= 12; month++) {
        if ((new Date(year, month, 1)).getDay() == 0) {
            sunday++;
        }
    }
}

window.alert(sunday);