• 締切済み

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

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

関連するQ&A

  • 二重ループのあるプログラム(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つの関数のいずれにおいても、ループを用いずに再帰呼び出しを用いるとどうなりますか?

  • C++でforや再帰関数を使わずに、総当りする方法はありますか?

    C++等で、forを使わず、再帰関数を使わずに多量のループで総当りする方法はありますでしょうか? 自己末尾再帰関数というのがネットで出てきますが、C言語系では使えないみたいです。 再帰関数で変数を全てスタティックにしても、関数の多重呼び出しで容量を食ってプログラムが動かないほどの計算をこなす必要があるのですが、こういった多数の桁のやり方になれておらず、先が見えません… また、全部をforにするのも、桁が大きすぎて問題があります。 どなたかご教授くださいますと幸いです。

  • C言語 ワイルドカード

    CUI環境でのワイルドカードのプログラムを考えています。 関数の再帰呼出しを使うと思うのですが、どのようなプログラムになるのでしょうか?もしくは、再帰呼び出しを使わずにワイルドカードを判別するプログラムが作れるのであれば、それはどのようになるのでしょうか?

  • 流れ図からプログラムに直してください!【C言語】

    その流れ図をC言語のプログラムに直してくれませんか? 処理2はscanf(..);って感じの内容です。 入口 処理1 for(処理2; 判断; 処理4){ 処理3 } 出口 って感じかなって思ったんですが、for文の中にscanfの文を入れてもいいのかわからずに悩んでます。 ループ文なのでwhile文、for文、do..while文のどれかかな?って思ったんですが違う気もして、わかるかたいらっしゃいませんか?

  • switch文とwhile文を用いたプログラムに関して

    swich文とwhile文を用いたプログラムについて 授業の課題で、swich文とwhile文を用いたプログラムを作りなさい。いう課題が出ました。 5桁以上9桁以下の正の整数を入力し、4で割り切れたとき、何桁の数字かを出力。4でわって1余ったとき、すべての桁の合計を出力。3余ったとき、与えられた数の逆を変数に代入し、その変数を出力(単純に表示するわけではなく、数字として表示) といったものです。 途中からの授業参加で、C言語に関する知識はほとんどありません。do文を用いたプログラムは見つけれたのですが、while文とswich文を用いろということなので、do文は使えないです。 どなたか教えていただけませんか? 今日中にわからないとちょっとやばいです・・・。 よろしくお願いします

  • C言語の二分法のプログラムについて

    二分法によりルート2の近似値を求めるプログラム、ってどうやって作ったらいいんですか? ちなみに初期値は2で、収束条件は10^-5です。 収束までの回数も求めなきゃいけません(ニュートン法と比較するため。ちなみにニュートン法はできました。) 似たような質問を見つけたのですが、どれも、難しいプログラムばかりで解読ができません。 関数とかif else文とかwhile文とかfor文とか、そういう簡単なのしか習ってないので、それで作れる範囲で教えてくださる方、 いらっしゃいましたら、よろしくお願いします。

  • c言語の問題

    c言語のプログラム 「1」が3枚、「3」が3枚、「5」が3枚、「7」が4枚、「9」が5枚で合計18枚のカードがある。このカードを並べて6桁の数を3個作り、その3個の数の総和が「1234567」となるカードの組み合わせをすべて求めたいのですがどうすればよいか全然分かりません。 6桁の数を配列で表現し、和を求めるときに1の位から上位の桁へ順番に和が一致しているかチェックするのを、再帰呼び出しででしたいです。

  • C言語のプログラムみてください(isdigit)

    質問は2つあります。 (1) scanf関数を使って、 時給: と表示されたところに一文字打ち込み、数字以外ならばもう一度 時給: と表示されるプログラムを作りたいです。 以下のプログラムなら、 isdigit関数は数字を渡せば0以外の数を返す(真)から、 while文の条件式(偽)のようにすれば、 ・数字を一文字うちこめばwhile文の条件式にあてはまらない、すなわち下のプログラムではisdigit(payment) != 0 となり、return 0; が実行され、プログラムが終わる ・数字以外を一文字打ち込めばwhile文の条件式が真となり、printf関数とscanf関数が実行されて入力待ち状態になる と思ったのですが、どうやら違うようです。実際には ・数字一文字打てばまた入力待ちになる ・数字以外を一文字打てば永遠にprintf関数とscanf関数が実行される のはなぜでしょうか。 #include <stdio.h> #include <ctype.h> int main(void){ int payment; do{ printf("時給[円]:"); scanf("%d",&payment); } while (isdigit(payment) ==0) ; return 0; } (2) 実際には、一文字の制限なく、数字以外の何かを入力したら、再び入力待ちになるプログラムを作りたいのですが、これはどうしたらいいのでしょうか。 つまり 時給: のところに数字以外ならまた 時給: となるようにしたいのです。お願いします。

  • C言語 ループ

    本当にこんな稚拙なプログラムで申し訳ないのですが、画像のr==1となってwhile以下をやりなおすときに、なぜかfor以下に入りません・・・ どなたか、アドバイスくれると助かります・・・ こんな冗長な記述で申し訳ありません ※特に問題とするのはなぜ二回目はwhile以下うまくループできないか、なので配列に代入しているものや、未知の関数は正しく作動しているものと考えてください。 なお、わかりやすいように、それぞれのスクショの一番下の行を選択してスクショしました。 一枚目は元のプログラムとその実行結果です。

  • C言語プログラム

    C言語プログラム ある数を入力して、入力された数を一辺とする図形を描くプログラムを作りたいんです。 分かりやすくすると、 入力された数が5だった時、画面には ***** ***** ***** ***** ***** ↑こう出力させたいんです。 四角だけじゃなくて、 * ** *** **** ***** ↑こういう三角とか、逆三角とか、 *        * **     *** ***  ***** **     *** *        * こんなかんじでいろんな形を描けるようにしたいんです。 C言語で、for文の二重ループを使うようにとのことなんですが、 どうすればいいでしょうか。 こういうのってズルですけど、何かヒントでも貰えればと思っています...。

専門家に質問してみよう