- 締切済み
二重ループのあるプログラム(C言語)
#include <stdio.h> int main(void) { int i, j, c, c2; c = 0; for(i = 100; i < 1000; i++) { c2 = 0; for(j = 1; j <= i; j++) { if (i % j == 0) c2++; } if (c2 % 2 == 1) c++; } printf("%d個です。\n", c); return 0; } というプログラムがあるのですが、2重ループ部分のそれぞれのループに対応して、 2つの関数として独立させるとどのようになりますか? また、2つの関数のいずれにおいても、ループを用いずに再帰呼び出しを用いるとどうなりますか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
#3さん、もうひとつの回答フォローありがとうございます m(_ _)m for() の分岐に忠実に、また sub(), div() 関数の引数定義から intのローカル変数も必要ないかと...。 追加少々訂正: #include <stdio.h> /* プロトタイプ宣言 */ int sub(int, int); int div(int, int, int); int main(void) { /* 引数:i=100, c=0 */ printf("%d個です。\n", sub(100, 0)); return 0; } /* for(i = 100; i < 1000; i++) */ int sub(int i, int c) { if (i < 1000) { if (div(i, 1, 0) % 2 == 1) c++; return sub(++i, c); } else return c; } /* for(j = 1; j <= i; j++) */ int div(int i, int j, int c2) { if (j <= i) { if (i % j == 0) c2++; return div(i, ++j, c2); } else return c2; }
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
再帰を勉強するのであれば、戻り値も再利用出来ることを覚えましょう。 少々訂正。 ------ #include <stdio.h> /* プロトタイプ宣言 */ int sub(int, int); int div(int, int, int); /*---------*/ int main(void) { int c = 0; c = sub(100, c); printf("%d個です。\n", c); return 0; } /*---------*/ int sub(int i, int c) { int c2 = 0; if (i >= 1000) return c; c2 = div(i, 1, c2); if (c2 % 2 == 1) c++; return sub(++i, c); } /*---------*/ int div(int i, int j, int c2) { if (j > i) return c2; if (i % j == 0) c2++; return div(i, ++j, c2); }
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
/* Recurcive virsion by Mac OSX * file name: xyz.c * compile: gcc xyz.c * execution: ./a.out */ #include <stdio.h> /* プロトタイプ宣言 */ void sub(int, int *); void div(int, int, int *); int main(void) { int c; c = 0; sub(100, &c); printf("%d個です。\n", c); return 0; } /* for(i = 100; i < 1000; i++) */ void sub(int i, int *c) { int c2; if (i < 1000) { c2 = 0; div(i, 1, &c2); if (c2 % 2 == 1) (*c)++; sub(++i, c); } } /* for(j = 1; j <= i; j++) */ void div(int i, int j, int *c2) { if (j <= i) { if (i % j == 0) (*c2)++; div(i, ++j, c2); } }
- SilverThaw
- ベストアンサー率32% (260/806)
>2つの関数として独立させるとどのようになりますか? 「関数化できないから、作ってほしい」って解釈でいいのかな? とりあえず >2重ループ部分のそれぞれのループに対応して、 の「対応」の意味があいまいなんだけど。