C言語関係掲示板

過去ログ

No.370.うるう年の判定

[戻る] [ホームページ]
No.2454

うるう年の判定
投稿者---よー(2002/08/22 01:41:10)


続けての質問になりますが・・

問題は「西暦年を入力し、その年が閏年か普通年であるかを判定する。
閏年とは
 4の倍数は閏年
 ただし、100の倍数は閏年ではない
 ただし、400の倍数は閏年
である。」

という問題ですが、
下のソースプログラムをコンパイルして
西暦を入力するところに400を入力すると
普通年がでてしまいます。
400、800、1200・・・と入力すると
普通年が出てしまいます。
「400の倍数は閏年」というところは
どういった解釈をしたらいいのでしょうか。

またよろしくお願いします。

#include<stdio.h>

int main(void)
{

int year;

printf("西暦を入力:");
scanf("%d",&year);

if(year % 4 == 0)
puts("閏年です。");
else if(year % 400 == 0)
puts("閏年です。");
else if(year % 100 == 0)
puts("普通年です。");
else if(year % 4 == 1 || year % 4 == 2 || year % 4 == 3)
puts("普通年です。");

return(0);
}

No.2455

Re:うるう年の判定
投稿者---長月葵(2002/08/22 02:48:42)


No.2335 YYYYmmdd形式の日付を、曜日 月 日 年(Thu Aug 8 2002)に変換
から始まるスレッドをどうぞ。

No.2459

Re:うるう年の判定
投稿者---かずま(2002/08/22 11:25:56)


> 下のソースプログラムをコンパイルして
> 西暦を入力するところに400を入力すると
> 普通年がでてしまいます。

閏年が出ます。事実をしっかり把握しましょう。

「ただし」で始まる判定は例外ですから、前に持っていきます。
#include <stdio.h>

int main(void)
{
    int year;

    printf("西暦を入力:");
    if (scanf("%d", &year) != 1) return 1;

    if (year % 400 == 0)
        puts("閏年です。");
    else if (year % 100 == 0)
        puts("平年です。");
    else if (year % 4 == 0)
        puts("閏年です。");
    else
        puts("平年です。");
    return 0;
}

400で割り切れるか、または 100で割り切れず 4で割り切れると、閏年。
これを、|| や && を使って書くとこうなります。

    if ((year % 400 == 0)  ||  (year % 100 != 0) && (year % 4 == 0))
        puts("閏年です。");
    else
        puts("平年です。");

でも、次のように書いたほうが、効率がよいはず。

    if (year % 4 == 0  &&  (year % 100 != 0 || year % 400 == 0))
        puts("閏年です。");
    else
        puts("平年です。");

なぜなら、平年の数のほうが多いから、最初に 4 で割り切れないことが多く、
その場合、100 や 400 で割り算をしなくて済みますから。