私は 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 ではありません。誰かヒントを教えてください。または、私のコードに何か問題がありますか?