• ベストアンサー

関数fのプログラム

1から4までの数字の順列をすべて印刷するプログラムを作りたいのですが、 ちょっとてこずっています。上級者から見れば簡単だと思います。 1234 1243 1324 1342 1423 1432    ・   ・   ・  というプログラムです。 誰か教えていただけないでしょうか。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

 「直ぐに回答がほしい」にマークしつつ、5日経っても回答に何の補足もお礼もないというのは、どうなんでしょう。(最低限のマナーは守りましょう。)  一応未解決と解釈して、下記2件の4重ループとは異なる、他の順列にも適用できるプログラムを挙げます。  全部ループでやるのは面倒なので再帰を使ってます。(一応補足ですが、ループで実現できない再帰はありません) #include <stdio.h> void permu(int n, int r, int *a, int m, int b); void let_permu(int r, int *p); int main(void) {   int a[32], n, r;   scanf("%d", &n);   if (n < 1 || 32 < n) return 0;   scanf("%d", &r);   if (r < 1 || n < r) return 0;   permu(n, r, a, 0, 0);   return 0; } void permu(int n, int r, int *a, int m, int b) {   int i;   if (r == m) {     let_permu(r, a);     return;   }   for (i = 0; i < n; i++) {     if (!(b & (1 << i))) {       a[m] = i + 1;       permu(n, r, a, m+1, b|(1<<i));     }   } } void let_permu(int r, int *p) {   int i;   for (i = 0; i < r; i++)     printf("%d%c", p[i], (i+1<r ? '-' : '\n')); } ∇解説 ・n個からr個を選んで並べる順列を、すべて求めます。 ・最初に入力を求められる n には、全体の数を入力します。 ・次に入力を求められる r には、その中から幾つ選ぶかを入力します。 ・32までの順列は作れるようになっています。(が、せいぜい10までぐらいにしないと、相当時間がかかります) ・関数permuのforループで、階層mの値を求めます。 ・b はバイナリフラグで、i ビット目が0の時のみ処理を行います。 ・求めた値 i+1を、a[m]に格納します。 ・次の階層m+1と、a[m]ビット目を1にしたフラグをパラメータにセットし、関数permuを呼び出します。これ以外のパラメータは、同じ値を使い回します。  これの繰り返しで順列を求めることが出来ます。 ・順列が1つ求まるたびに let_permu 関数が呼ばれるので、そこでバッファにためるなり、印刷するなりの処理を行ってください。(ここでは単純に表示しています) ・表示上の都合で、全角スペースを使っています。コピペした際は半角へ変換してください。

solvalov
質問者

お礼

詳しく説明してもらってありがとうございます。参考になりました。 ところで、4重ループを使ったプログラムはどのようなものなのでしょうか? もし教えていただけるなら幸いです。

その他の回答 (2)

  • arika
  • ベストアンサー率9% (18/186)
回答No.2

考え方 配列をつかう。 4重ループ それぞれのループでは、配列にマークされてない 数字をえらぶ。 そして、そのループで使用した数字の配列にマーク (一番そのループは配列サーチはいらない) っていうのはどうでしょ。

  • g_dori
  • ベストアンサー率47% (330/699)
回答No.1

簡単にやり方だけ。 (1)4重ループを作って、4桁にそれぞれ1~4を突っ込む。 (2)各桁の掛けた合計が24であったら、その値を保存。(24になる場合は常に1,2,3,4の組み合わせ) (3)最後に全部を並べて印刷 これで良いんじゃないでしょうか?(1~4の組み合わせ限定的なものがあるので、実用的ではありませんが・・・) 私に勘違いがあったら申し訳ありません。

関連するQ&A

  • 同じものを含む順列

    連続する16個の数字から、4つ取り出してその組合せを全て表す処理を作ろうとしています。 まずは意味からと思い、いろいろ検索して調べても、うまく理解できず、最後の手段でここに投稿いたします。 組合せのパターンを割り出すのに、「同じものを含む順列」を使って行うと言われています。 いろいろ調べて混在したものが、意味の違いの点?で、「同じものを含む順列」と「重複順列」とは同じことを表すのでしょうか。 また、「同じものを含む順列」のパターン出力のプログラムを作る必要があり、参考になるサンプルが存在するなら教えていただけないでしょうか。 (順列や組合せは見つかったのですが) 宜しくお願いします。

  • プログラムでの数字につく”f”の意味

    こんばんは。 プログラムで数字に"f"が付いている(4.0fなど)ものを見かけるのですが この"f"の意味はなんなのでしょうか? よろしくお願い致します。

  • VBAで関数をつくる

    If文やForNext構文を駆使して階乗、順列、組み合わせの計算を実現する関数を作りたいです。どのように考えてどのようなプログラムを書けばよいか教えてください!

  • プログラム

    10進数の数字をキーボードから読み込み、 2進数の数字に変換するプログラムなんですけど、 C言語では2進数は取り扱えないみたいなんですけど、 どうすればこのプログラムを書くことが出来ますか。

  • VBAで順列を表現する方法

    VBAによる順列の表記の仕方を教えてほしいです。 例えばn個の数値から2つの要素を並べる順列nP2の場合、1番目に選んだ数値が2番目の順列の選択候補から外れ、1番目と2番目の数値を順列として表示するようなVBAを組みたいです。 つまり同じ数字を2回以上使わないnPm(m≧2)という順列を作成したいのです。 どのようなプログラムを組めばよいか教えてください。

  • 簡単なプログラム

    例えば、適当な数字の羅列「26324732」からその羅列の中に指定する数字の数を出すプログラムはどのようにすれば良いのでしょうか? 2と入力したら3個、3と入力したら2個と出るプログラムです。 知識が全くないので、どなたか教えてください!!

  • EXCELで並べ替えってできますか?

    例えば5つの数字(1.2.3.4.5)の順列(5!個)をすべて表示させるような方法ありますか?

  • プログラミングについて

    4個の異なる一桁の数字からなる順列を乱数で生成し、 ターミナルで4個の数字の順列を入力すると、 生成した順列と入力した順列を比較し、 数とその位置があっている場合は「ヒット」 数は合っているがその位置が違う場合は「ブロー」とし、 そのヒット数とブロー数を表示するプログラムを教えてください。 実行するとこんな感じになると思います、 (生成した順列3569) Number?:0123 Hits:0,Blows:1 Number?:0124 Hits:0,Blows:0 Number?:3567 Hits:3,Blows:0 Number?:3569 Hits:4,Blows:0 Trials:4

  • インストールされている全てのプログラムを印刷するには?

    はじめまして。 インストールされている全てのプログラムを印刷するにはどうしたらよいのでしょうか? 会社にある全てのパソコンに何のプログラムがインストールされているか集計しなければならなくなりました。 よろしくお願いいたします。

  • 関数について教えてください。宜しくお願いします。

    Excelの関数が苦手で試行錯誤しております。 ぜひ、お知恵をお貸しください。 シートが5つあります。 1.統計 2.A 3.B 4.C 5.D 各シートには、 上級 200/150/100/90/80/70 中級 150/100/80 普通 80/60/50 合計12種類の項目があるとします。 例       1月 2月 ・・・・・・・・・・12月 上級 100   5100 2300 上級 150   2850 8900 普通 80    550 4300 ・・ これを、2~5のシート各「上級」「中級」「普通」ごとに 統計側に各項目で数字を合計したいのです。 各シートごとで、上級/中級/普通で合計をして、最後に統計に 反映すればいいのでしょうが、面倒なので、統計のシートの中で、 関数にて、2~5の合計値として 例       1月  2月 ・・・・・・・・・・12月 上級     10000 24000 中級     58000  9500 普通     34000 32000  と一気にしたいのです。 もしご存知であれば、すばやく簡単にできる関数や方法を 教えてください。 以上、宜しくお願い致します。

専門家に質問してみよう