isLeapYear という関数を考えてみましょう。引数は年です。年がうるう場合は true を返し、そうでない場合は false を返す必要があります。
ウィキペディアが述べているように、条件は次のとおりです。
年が 4 で割り切れない場合は平年、年が 100 で割り切れない場合は閏年、年が 400 で割り切れる場合はうるう年、平年。
3 つではなく 2 つの条件だけでうるう年かどうかを判断できますか?
isLeapYear という関数を考えてみましょう。引数は年です。年がうるう場合は true を返し、そうでない場合は false を返す必要があります。
ウィキペディアが述べているように、条件は次のとおりです。
年が 4 で割り切れない場合は平年、年が 100 で割り切れない場合は閏年、年が 400 で割り切れる場合はうるう年、平年。
3 つではなく 2 つの条件だけでうるう年かどうかを判断できますか?
はい、以下を「2つの条件」と考えれば:
年が 4 で割り切れない場合、または 100 で割り切れるが 400 で割り切れない場合、それは平年です。
それ以外の場合はうるう年です。
C で実装されています。たとえば、次のようになります。
int IsCommon(int year)
{
if (year%4 != 0 || (year%100 == 0 && year%400 != 0))
return 1;
else
return 0;
}
ただし、実行時のパフォーマンスに関しては、ウィキペディアの定義を「3 つの条件」から「2 つの条件」に「凝縮」しても、ここで得られるものはあまりないことに注意してください。論理演算子 (||
および&&
) は、次のような条件ステートメントと同じ分岐を生成しif/else if
ます...
これは、ステートメントがコンパイルされる方法に依存しswitch/case
、単一の分岐操作のみを実行する代替ソリューションです。これはアルゴリズムによるソリューションではなく、プログラムによるソリューションであることに注意してください。少なくとも C、C++、および Java (マイナーなセマンティクスを除く) に適していますが、おそらく他の言語にも同様のバリエーションがあります (たとえば、Python の辞書)。
int IsCommon(int year)
{
switch (year%400)
{
case 0:
case 4:
case ...
case 96:
case 104:
case ...
case 196:
case 204:
case ...
case 296:
case 304:
case ...
case 396:
return 0;
}
return 1;
}
私の記憶が正しければ、switch/case
すべてのケースが 0 から始まるインクリメントされた連続した順序でリストされている場合、ステートメントは最も効率的な方法でコンパイルされます。したがって、以下の例のように、このコードをさらに拡張できます。
int IsCommon(int year)
{
switch (year%400)
{
case 0: return 0;
case 1: return 1;
case 2: return 1;
case 3: return 1;
case 4: return 0;
case 5: return 1;
case 6: return 1;
case 7: return 1;
case ...
case 96: return 0;
case 97: return 1;
case 98: return 1;
case 99: return 1;
case 100: return 1;
case 101: return 1;
case 102: return 1;
case 103: return 1;
case 104: return 0;
case 105: return 1;
case 106: return 1;
case 107: return 1;
case ...
case 196: return 0;
case 197: return 1;
case 198: return 1;
case 199: return 1;
case 200: return 1;
case 201: return 1;
case 202: return 1;
case 203: return 1;
case 204: return 0;
case 205: return 1;
case 206: return 1;
case 207: return 1;
case ...
case 296: return 0;
case 297: return 1;
case 298: return 1;
case 299: return 1;
case 300: return 1;
case 301: return 1;
case 302: return 1;
case 303: return 1;
case 304: return 0;
case 305: return 1;
case 306: return 1;
case 307: return 1;
case ...
case 396: return 0;
case 397: return 1;
case 398: return 1;
case 399: return 1;
}
return -1; // Just in order to prevent a compilation error (i.e., dummy)
}
いいえ、条件は 2 つではなく 3 つです。