- ベストアンサー
うるう年を求めるプログラム
1900から2100年のうるう年を求めるプログラムが作りたいのですが どうしたらよいでしょうか? forを使って1900から2100までかぞえる。 4で割り切れるものは閏年 しかし100で割り切れるものは閏年でない。 400で割り切れるものは閏年である。 最後の条件の分岐から閏年のみを表示させたいのですがわかりません 。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
int uruu; int year; for(year = 1900; year <= 2100; year++) { if(year % 4 == 0) { // 4で割り切れる if(year % 100 == 0) { // 100で割り切れる if(year % 400 == 0) { // 400で割り切れる = 閏年 uruu = 1; } else { // 400で割り切れない = 閏年では無い uruu= 0; } } else { // 100で割り切れない = 閏年 uruu = 1; } } else { // 4で割り切れない = 閏年ではない uruu = 0; } if(uruu == 1) { // 閏年のときの処理 } else { // 閏年ではないときの処理 } } 規則どおりに書くのならこうなるね。 改良の余地はあるかもしれないけど。
その他の回答 (4)
- nebel
- ベストアンサー率37% (117/308)
/* 閏年判定関数 引数に西暦を渡し、閏年なら1を閏年でなければ0を返す*/ int leapyear( int year ){ return (((year%4==0) && (year%100!=0) || (year%400==0)) ? 1 : 0); } int main(){ int i; for(i=1900;i<=2100;i+=4){ if( leapyear(i) ){ print("%d\n",i); } } leapyear関数自体は汎用。 main内のループは、1900から2100までの閏年ってのに合わせてある。
- qtea
- ベストアンサー率77% (38/49)
かなり、手を抜くなら… 1900から2100の間で ・4で割り切れる ・100で割り切れる ・400で割り切れない ものは、1900と2100だけなんですよね。 なので、1904から4づつ足していったものを表示するだけで良いような… で、2096以下になったら、ループを抜ける、と。
お礼
そういえばそうですね、気付きませんでした。 回答ありがとうございます。
- chie65536
- ベストアンサー率41% (2512/6032)
誤魔化して書くなら、こう。 int nen; for (nen = 1901;nen < 2100;nen++) { if ((nen & 3) == 0) ptintf("%d年は閏年\n",nen); } ループの最初と最後の、1900年と2100年は通常年なので、ループしないで除外し、4で割れるかしか見ていない。 実際、1901~2099年の期間で使用する、年を下2桁しか持たないカレンダーICチップは、閏年の判定は「4で割り切れるなら閏年」としか判定しない。 更に言うなら年の割り算さえしない。年を保持するメモリの下位2ビットを取り出し、この2ビットが共に0の時は閏年、と処理している。 どうしてこういう手抜きをするかと言えば、計算が簡単になれば回路も簡単になり、それだけコストダウンになるのが理由。 ループから1900と2100を除外しないなら、こう。 int nen; for (nen = 1900;nen <= 2100;nen++) { if ((nen==1900)||(nen==2100)) continue; if ((nen & 3) == 0) ptintf("%d年は閏年\n",nen); } 年の制限をせずに、きっちり全部判断したいなら、質問者さんで工夫して下さい。
4で割り切れるかどうかを調べるには、割余演算子を使います。 C言語の場合、% 演算子です。 if ( nen % 4 = 0 ) { // 4で割り切れる } こんな感じ。他の条件も一緒です。
お礼
細かく教えていただきありがとうございます。 参考にさせてもらいます。