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

1900から2100年のうるう年を求めるプログラムが作りたいのですが
どうしたらよいでしょうか?

forを使って1900から2100までかぞえる。
4で割り切れるものは閏年
しかし100で割り切れるものは閏年でない。
400で割り切れるものは閏年である。
最後の条件の分岐から閏年のみを表示させたいのですがわかりません

A 回答 (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 {
  // 閏年ではないときの処理
 }
}

規則どおりに書くのならこうなるね。
改良の余地はあるかもしれないけど。
    • good
    • 1
この回答へのお礼

細かく教えていただきありがとうございます。
参考にさせてもらいます。

お礼日時:2006/10/26 23:56

/* 閏年判定関数 


  引数に西暦を渡し、閏年なら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までの閏年ってのに合わせてある。
    • good
    • 1

かなり、手を抜くなら…



1900から2100の間で
・4で割り切れる
・100で割り切れる
・400で割り切れない
ものは、1900と2100だけなんですよね。
なので、1904から4づつ足していったものを表示するだけで良いような…
で、2096以下になったら、ループを抜ける、と。
    • good
    • 0
この回答へのお礼

そういえばそうですね、気付きませんでした。
回答ありがとうございます。

お礼日時:2006/10/26 23:57

誤魔化して書くなら、こう。


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);
}

年の制限をせずに、きっちり全部判断したいなら、質問者さんで工夫して下さい。
    • good
    • 0

 4で割り切れるかどうかを調べるには、割余演算子を使います。


 C言語の場合、% 演算子です。

 if ( nen % 4 = 0 ) {
  // 4で割り切れる
 }

 こんな感じ。他の条件も一緒です。
    • good
    • 1

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