私はProgramming、Javaについては初めてです。私はProject EulerのWebサイトで作業して自分自身を教えようとしています。私はこの問題を完了しようとしています:http://projecteuler.net/problem=19、である:Java、1901年から2000年の1月に落ちた日曜日のカウント数
日曜日は二十 世紀の間に月の最初に落ちたどのように多くの(1901年1月1日は、2000年12月31に)?
私はそれを解決するために考えた方法は、カレンダーを表す2D配列を作成し、7までカウントして配列をループし、7までカウントするたびにそのポイントに1を加算することでした配列内にあります。結局、私は配列の最初の行を合計し、それは月の初めに何回の日曜日だったのでしょうか?
私のループに問題があります。月末になると7回カウントされてリセットされますが、それをやめる方法を理解できません。ここで
が私のコードです:
public class Problem019 {
public static void main (String[] args){
//System.out.println(LeapYearTest(1996));
int ThirtyOne = 31;
int Thirty = 30;
int FebNorm = 28;
int FebLeap = 29;
int a, b, c, Day, e = 0, f = 0;
int Calander[] []= new int [12] [] ;
Calander[0] = new int [ThirtyOne];
Calander[1] = new int [FebNorm];
Calander[2] = new int [ThirtyOne];
Calander[3] = new int [Thirty];
Calander[4] = new int [ThirtyOne];
Calander[5] = new int [Thirty];
Calander[6] = new int [ThirtyOne];
Calander[7] = new int [ThirtyOne];
Calander[8] = new int [Thirty];
Calander[9] = new int [ThirtyOne];
Calander[10] = new int [Thirty];
Calander[11] = new int [ThirtyOne];
for (a=1901;a<2001;a++){
//System.out.println(a);
if (LeapYearTest(a))
{
Calander[1] = new int [FebLeap];
}
else
{
Calander[1] = new int [FebNorm];
}
for (e=0;e<Calander.length;e++)
{
System.out.println("e: " + e);
f=0;
while (f<Calander[e].length)
{
//System.out.println(Calander[e].length);
Day=1;
while (Day<8 && f<Calander[e].length)
{
System.out.println("f: " + f + "\tDay: " + Day + "\tCalander[e][f]: " + Calander[e][f]);
Day++;
f++;
if (f<Calander[e].length && f!=0 && Day==7)
{
Calander[e][f]+= 1;
}
}
}
}
//System.out.println(a);
}
for (b=0;b<Calander.length;b++)
{
System.out.print(Calander[0][b]);
}
}
public static boolean LeapYearTest(int x)
{
if (x%4==0 || x%400==0){
return true;
}
if (x%100==0){
return false;
}
else return false;
}
}
これは、eが月で、それが印刷さ何で、fは月の日で、日が7にカウントされます。
どうf: 25 Day: 5 Calander[e][f]: 0
f: 26 Day: 6 Calander[e][f]: 0
f: 27 Day: 7 Calander[e][f]: 100
f: 28 Day: 1 Calander[e][f]: 0
f: 29 Day: 2 Calander[e][f]: 0
**f: 30 Day: 3 Calander[e][f]: 0**
e: 10
**f: 0 Day: 1 Calander[e][f]: 0**
f: 1 Day: 2 Calander[e][f]: 0
f: 2 Day: 3 Calander[e][f]: 0
今月の終わりに日がリセットされないようにループを設定することはできますか?または、非常に多くのネストされたループを伴わないこの問題を解決する別の方法がありますか?
ありがとうございました!
その体を簡素化するための方法を比較し変更。あなたは繰り返し、Sun 1stの総数を増やすだけです。カウンタ0-6と並行して反復し、現在の月の日数に移動する別のカウンタを繰り返します。 –
さらに、毎日繰り返すだけでなく、月の初めにある日曜日を計算する、より巧妙な方法があります。他に誰もあなたのコードを見ないならば重要ではありませんが、* Calendar *のスペルを間違えてしまいます。また、Javaのコード規約ではcamelCaseの変数名(最初の文字は小文字)を使うことをお勧めします。 – rob
@マルコ:申し訳ありませんが理解していない、あなたは精巧にできますか? – Keith