1

私は Project Euler #19 をやっています。状態は次のとおりです。

次の情報が提供されますが、自分で調査することをお勧めします。

1900 年 1 月 1 日は月曜日でした。30 日間には、9 月、4 月、6 月、11 月があります。残りはすべて 31 で、2 月だけを保存します。これには 28 があります。そしてうるう年には、29。うるう年は 4 で割り切れる年に発生しますが、400 で割り切れない限り、1 世紀には発生しません。

曜日を計算する数式をインターネットで検索しました。ゼラー式が優れていることがわかりました。W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1.(C は世紀 + 1、y はその年の最後の 2 つの数字)しかし、1900.01.01を確認すると、月曜日のはずですが、式によると6(つまり土曜日)であることが間違っています。

多くの日付を確認しましたが、ほとんどすべてがこの式に適しています。でも、まだまだ合わない日は少ないです。この場合の私の Java コードは以下のとおりです。

package number;

public class CountingSundays {
    public static int calculateWeek(int year, int month, int date){
        int c = year/100;
        int y = year%100;
        int w = c/4-2*c+y+y/4+13*(month+1)/5+date-1;
        w = (w%7 + 7)%7;
        return w;
    }
    public static void main(String[] args) {
//      int w = calculateWeek(1900, 01, 01);
//      System.out.println(w);
        int count = 0;
        for(int i = 1901; i <= 2000; i++)
            for(int j = 1; j <= 12; j++)
                if(calculateWeek(i, j, 01) == 0)
                    count++;
        System.out.println(count);
    }
}

不一致の場合、私の出力は 173 です。これは必要な結果 171 ではありません。誰かヒントを教えてください。または、私のコードに何か問題がありますか?

4

3 に答える 3

2

グレゴリオ暦と英語のことなら

GregorianCalendar gc = new GregorianCalendar(1, Calendar.JANUARY, 1900);
System.out.println(gc.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.ENGLISH));

出力

Monday

于 2013-05-04T17:01:55.243 に答える