アプリ版:「スタンプのみでお礼する」機能のリリースについて

3桁、あるいは4桁の整数を10個程度入力して、これらの中
に閏年が何個含まれるか求めるプログラムの書き方を教え
てください。
 お願いします。

A 回答 (8件)

単純にユリウス暦とグレゴリオ暦だけの話だとしても、(宗教上の問題もあるので)国によって切り替えの時期が異なります。


ロケールで判断するのであれば処理系に依存しますし、そうでなければ国(または文化圏)を指定する方法を別途規定する必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございました^^

お礼日時:2009/02/06 22:20

因みに。



ユリウス暦は4で割り切れる年を必ず閏年とする。100とか400は考えない。

グレゴリオ暦は、4で割り切れる年を閏年とするが、100で割り切れる年は閏年とせず、400で割り切れる年は閏年をする。

「ユリウス暦の1582年10月5日をグレゴリオ暦の1582年10月15日とする」として切り替えたので、1582年よりも前は、4で割り切れたら必ず閏年として判断し、100とか400とかは考えてはいけない。

なので、1200、1300、1400、1500年は閏年(例外は一切なし)、1600年も閏年(400の、例外の例外)、1700年は平年(100の、例外)、となる。
    • good
    • 0
この回答へのお礼

回答ありがとうございました^^

お礼日時:2009/02/06 22:20

まず「入力する整数は何なのか」と「閏年ってどんな日なのか」ってのを、きちんと提示しましょう。



例えば、エチオピアでは、閏年は「4で割り切れる年の前の年の、13月6日」が閏年です。因みに、エチオピアは、今は「2001年5月」です。

入力する数値が、西暦年なのか、エチオピア年なのか、皇紀年なのか、そこんところをハッキリさせましょう。

そして閏年も、それがどういうモノなのかハッキリさせましょう。

それらがハッキリしないと、プログラムは作れません。

1.整数を1つ入力するだけのプログラムを作る。
#include <stdio.h>
int main(void)
{
int year;
scanf("%d",&year);
return 0;
}

2.上記1のプログラムを改造して、整数を入力し、入力した整数が0だったら終了、0じゃなかったら入力を繰り返すようにする。
3.上記2のプログラムを改造して、0が入力されたら今までに入力した整数の「個数」を表示して終了、0じゃないなら入力した「個数」をカウントアップして入力を繰り返すようにする。
4.上記3のプログラムを改造して、入力した整数が0でなく、かつ、3桁か4桁の整数じゃなかった時は、カウントアップせずに入力をやり直すようにする。
5.上記4のプログラムを改造して、入力した個数をカウントする部分を、入力した整数が閏年の時だけカウントするようにする。

何も無い所から一気に「最終目的のプログラム」を書くのは無理なので、上記のように「少しづつ積み上げていく」と良いでしょう。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございました^^
一つずつやってみます。

お礼日時:2009/02/06 22:22

日本で最初に使われた暦法は「元嘉暦」(692年採用) なので, この年より前の値は意味を持ちません. 西暦だと仮定しても, グレゴリオ暦以前は置閏法が異なるのでその調整が必要です. グレゴリオ暦を単純に延長していいなら #3 の通りですが, それがこの問題に即して正しいかどうかは知りません.


#4 の与太話につきあってみる試み:
太陰太陽暦では「どの年を閏年にするか」という直接の規定があるわけではありません. 実際には「どの月が閏月になるか」という規定があり, その結果として閏月が含まれる年が閏年になります.
それを前提においておきますが, メトン周期 (19年=235朔望月) の関係で大体 19年に 7回閏月が入ることになり, 近似的には「年を 19で割った余り」で閏年になるかどうかが判定できるはずです.
ただし, 暦法によっては「閏十二月」が存在しうる (実際に存在する) ため, 厳密にやろうとすると月の運行をきちんと考える必要があります... 未来の分はたぶん不要なので, 過去のデータを調べた方が早いかな.
さらに余談では, 日本の法令上「神武天皇即位紀元」をつかって閏年かどうかを調べるのがきっと正しい. といっても神武紀元が西暦に 660 を足したものだし, 法令では「神武紀元から 660 を引いた値を使って調べる」となっているので結局西暦を使うことと同じ.
    • good
    • 0
この回答へのお礼

回答ありがとうございました^^

お礼日時:2009/02/06 22:22

まぁ仮に日本の暦だとしても和暦か西暦かって話がありますしねぇ。


#太陰太陽暦の閏年ってどんな定義でしたっけか

とかヨタ話は置いておいて(どうせ西暦の閏年でしょうから)。

・入力された数値が閏年かどうかを判定し、閏年であれば+1

というのを10回(程度)繰り返すだけですけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございました^^

お礼日時:2009/02/06 22:23

暦にもいろいろありますからね。


閏年だけでは問題に不備があるので作れないですね。
入力された整数で400の倍数または4の倍数で100の倍数でない数がいくつあるかなら作れますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございました^^

お礼日時:2009/02/06 22:23

「閏年を求める」? なぜ?


「指定した年が平年か閏年か」を判定できればいいだけじゃないの?
でも, 入力した数値が西暦の年を表すんだとしたら, 「閏年かどうか」すら問題になるんじゃないかね. 「どの国で採用した暦法を使うか」というところから決めないとダメ.
    • good
    • 0
この回答へのお礼

説明不足でした。すいません(汗
回答ありがとうございました^^

お礼日時:2009/02/06 22:19

複数個をうるう年かどうかを判定させるロジックを組む前に、うるう年を求める計算を調べてください。


いくらでも存在しています。
ただし、公式の一つ一つの意味を理解してください。
なぜ、ここで400という数字がでてくるんだ?とか、とか・とか・・・・


完成形のみを考えているとなかなか上手くいきません。
一番小さな単位からコツコツやっていきましょう。
    • good
    • 0
この回答へのお礼

 回答ありがとうございます。
閏年を求めるやり方はわかるのですが、
その数を表示させるやり方が分からなくて・・・
頑張ってみます^^

お礼日時:2009/02/02 23:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!