• 締切済み

C言語のプログラムについて

C言語のプログラムについて 3桁の自然数の中で、自分自身を含めた約数が奇数になるものがいくつあるかを求めるプログラムを作りたいのですが、swich文を使って、6通りの方法で出そうとしていまして、 while 文、 for文、 do while文に加え、 for文のを、1つの関数として独立させたもの、 さらに、for文のを重ループ部分のそれぞれのループに対応して、2つの関数として独立させたもの、 そして、この2つの関数のどちらともをループを用いずに再帰呼び出しを用いたもの の6通りで出したいのですが、swich文を使うところは自力でできたのですが、あとの6つそれぞれのプログラムの組み方がわかりません。 教えていただけないでしょうか?ややこしい書き方をしてすいません・・・。

みんなの回答

回答No.4

 質問の「3桁の自然数の中で、自分自身を含めた約数が奇数になるもの」の意味がいまいちなのですが、取り合えず「素因数分解の中に奇数が含まれる自然数」ということで ↓のようにプログラムしてみました。  なお、「for文のを重ループ部分」は「3桁の自然数の中」に用いられることから重部分にはならず、質問の「2つの関数として独立させたもの」は作れませんのご了解ください。 /* Answer by Mac OSX * file name: non.c * compile: gcc non.c * execution: ./a.out */ #include <stdio.h> #define BEGIN 100 #define END 1000 // 最大+1 #define ON 1 #define OFF 0 /* プロトタイプ宣言 */ int loop_for(void); int recurcive(int, int); int prime(int); int main(void) { char *comment[]={"while文","for文","do~while文","for関数","for再帰"}; int i, n, count; /* 実行方法の選択 */ for (i = 0; i < 5; i++) printf("%d. %s\n", i + 1, comment[i]); printf(">番号は? "); scanf("%d", &n); printf("\t"); // 見易くタブブレ /* メイン・プログラム */ switch (n) { case 1: count = 0; i = BEGIN; while (i < END) { if (prime(i++)) count += 1; } printf("while()= %d\n", count); break; case 2: count = 0; for (i = BEGIN; i < END; i++) { if (prime(i)) count += 1; } printf("for()= %d\n", count); break; case 3: count = 0; i = BEGIN; do { if (prime(i)) count += 1; } while (++i < END); printf("do()while= %d\n", count); break; case 4: printf("関数for= %d\n", loop_for()); break; case 5: printf("for再帰= %d\n", recurcive(BEGIN, 0)); break; default: printf("?? 番号は1~5です。\n"); break; } return 0; } int loop_for(void) { int i, count; count = 0; for (i = BEGIN; i < END; i++) { if (prime(i)) count += 1; } return count; } int recurcive(int i, int c) { if (i < END) { if (prime(i)) c++; return recurcive(++i, c); } else return c; } int prime(int n) { int m; for (m = 2 ; n != 1; m++) { while(n % m == 0) { n /= m; if (m % 2) return ON; } } return OFF; }

  • towad
  • ベストアンサー率80% (4/5)
回答No.3

下記プログラムの修正です mult = (inval / measure) * measure; if (inval == mult) { の部分は if (inval % measure == 0) { で済みますね。大ボケな書き方してました。 if ((measure / 2) * 2 != measure) { も同様です。

  • towad
  • ベストアンサー率80% (4/5)
回答No.2

自分なりに奇数である約数の個数を求めるプログラムを考えてみたのですが、どう考えても二重ループを要するプログラムが思いつきませんでした。下記プログラムの出力で意味は合っているのでしょうか? #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char input[10]; int inval, measure, mult, count; printf("input value:"); fgets(input, 8, stdin); inval = atoi(input); count = 0; for (measure = 1; measure <= inval; measure++) { mult = (inval / measure) * measure; if (inval == mult) { if ((measure / 2) * 2 != measure) { printf("%d is odd\n", measure); count++; } else { printf("%d is even\n", measure); } } } printf("total of odd measure is %d\n", count); return 0; } >./a.out input value:100 1 is odd 2 is even 4 is even 5 is odd 10 is even 20 is even 25 is odd 50 is even 100 is even total of odd measure is 3 > #素因数分解をしたいとかじゃないですよね?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

.... 「あとの」とか書いてるけど, 「ある意味どうでもいいところはできたけど本質的な部分は全く何もできていない」ってことだよね? そもそも問題の「自分自身を含めた約数が奇数になる」ということの意味が分からん. どういうことか説明してください.