2016-11-30 7 views
-2

グレゴリオ暦の特定の年がうるう年かどうかを示すコードを書く必要があります。しかし、コードが毎年動くかどうかはわかりません。それは1900年、1901年、2000年に働きます。年が閏年であるかどうかを調べることを証明するコード

グレゴリアン年をうるう年にする前に、うるう年を作るべきでしょうか。モジュロ4の年が0の場合は、うるう年です。 4 = 0、年%100 = 0なら、それはそうではありません。最後に、年%4 = 0、年%100 = 0、年%400 = 0の場合、それはです。ここで

コードです:レコードの

public static boolean isLeapYearGregorian(int year) { 
    if ((year % 4 == 0) && (year % 100 != 0) || (year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) { 
     return true; 
    } 
    else { 
     return false; 
    } 

} 

おかげ

+0

とは何ですか? – XtremeBaumer

+0

観測: '(年%4 == 0)&&(年%100 == 0)&&(年%400 == 0)'は '(年%400 == 0)'に単純化することができます400の倍数は必ず4と100の倍数です)。 – khelwood

+1

より多くの年をチェックしてください。それは2016年には機能しますか? 2017? 1600? 1601?テストするケースが増えるほど、自信が深まることができます。これは単体テストの本質です。あなたがまだ不明な場合は、なぜあなた自身に尋ね、あなたの疑いが合理的であれば、より多くのテストケースを用意してそれらを守る。 –

答えて

1

、コードは、単に

public static boolean isLeapYearGregorian(int year) { 
    return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0); 
} 

としてではなく、OPのコードに近い開始のために書き込むことができますこれから始めましょう:

public static boolean isLeapYearGregorian(int year) { 
    return (year % 4 == 0) && (year % 100 != 0) || (year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0); 
} 

上記のands(&&)とors(||)が同じレベルにあり、違いがあるため、この時点でoperator precedence in Javaを知る必要があります。短い答え:ANDはORの前に来る。

  • (年%4 == 0)AND(年%100 = 0!)
  • OR
  • (年%4 == 0):

    今論理はとして挙げることができますAND(年%100 == 0)ANDと言うことです(年%400 == 0)

  • (年divisi 4によってBLE)AND(100によって年割り切れない)
  • OR
  • 4で割り切れる(年)AND 100で割り切れる(年)AND(400で割り切れる年)

今、あなたは比較することができますdefinition of a Gregorian calendar leap yearの擬似コードとロジック:

if (year is not divisible by 4) then (it is a common year) 
else if (year is not divisible by 100) then (it is a leap year) 
else if (year is not divisible by 400) then (it is a common year) 
else (it is a leap year) 

ここから、私達があなたの質問にコードから抽出されたロジックに比較することは簡単で、ウィキペディアで定義されているはいコードが正しく、うるう年に識別するていることを確認します

比較が完全に単純でないと思われる場合は、truth tablesに頼って、2つの論理ステートメントが同じであることを完全に証明することができます。

truth table of leap year identification

関連する問題