• 締切済み

"n!"(階乗)の数字列の生成

ある"n"(数字)を入力すると、"n!"(階乗)通りの数字列を生成するプログラムを作りたいのですが、 どのような考え方でプログラムを作成すればよいのかわかりません。 例えば、"7"と入力すると 1,2,3,4,5,6,7 1,2,3,4,5,7,6 1,2,3,4,6,5,7    ・    ・    ・ 7,6,5,4,3,2,1 のように7!通りの数字列を出力されるようにしたいのです。 アドバイスを頂けないでしょうか。よろしくお願いします。

みんなの回答

回答No.2

Oiron_Uotiさん、今日は。 順列生成の基本的な考えは、n!個の順列に1からn!までの重複しない番号をつけることです。 それができたら番号を受け取って順列を返す関数を作ります。(下記参考サイトでは最小完全ハッシュ関数と呼んでいます。C言語を使っていますが、原理が載っていますので、VBに直すのもたいした手間じゃないでしょう) それを例えばSub GetPerm(Number as integer, Perm() as byte)とするとき、  for i=1 to 100 GetPerm(i,Perm); next i; のように書くと、Permに順に番号1から100までの順列が入ることになります。 ネット上で検索すると1番目の順列を元に2番目を作る、2番目を基にして3番目を作る・・・というようなやり方がほとんどですが、上で書いたやり方の大きな利点は、例えば100億個の順列がほしいとき、10億個毎に別マシンで行うというように簡単に分散化できることです。 ところで、nはどの程度の大きさを想定していますか。 通常は、12!までしか取り扱えないことはご存知ですよね。

参考URL:
http://www.ic-net.or.jp/home/takaken/nt/slide/hash.html
Oiron_Uoti
質問者

お礼

ありがとうございます。 このやり方だと、先頭が"1"の文字列のみ欲しいという場合にも対応できそうですね。

Oiron_Uoti
質問者

補足

nは9くらいまでを想定しています。 12!までしか扱えないということは知りませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1
参考URL:
http://okweb.jp/kotaeru.php3?qid=1123441
Oiron_Uoti
質問者

お礼

ありがとうございます。 C言語はわかりませんが、参考にします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • nの階乗の近似

    nの階乗を(2πn)^1/2*n^n*exp(-n+n/12+…)と近似できるのは何故ですか?

  • 階乗のプログラム

    c言語初心者です。 13までの階乗の値を計算するプログラムを下のように書いたのですが、 #include <stdio.h> main() { int N, fact; fact=1; for(N=1; N<=13; ++N){ fact=fact*N; printf("%d!=%d\n",N, fact); } } このプログラムを実行してみると、12!までは正しい値が出力されるのですが、13!の値が1932053504と出力され、計算機の値と違います。 どこが間違っているのでしょうか。どなたかご教授お願いします。

  • Nの階乗

    この問題がどうすればいいのかまったくわかりません。 考え方を教えて下さい。 ------------------------------------------------ まず、プログラムの中で一つの整数N(1<=N<=100)を入力させる。そして、一桁ずつを一つの整数配列の別々の箱に入れる表現を用いて、Nの階乗を計算し、その結果を表示するプログラムを作れ。例えば1258をdat[4]=1, dat[3]=2, dat[2]=5, dat[1]=8と表す。アルゴリズムには、ループ(for文、while文、repeat文のいずれか)を用いなさい。

  • 数字列?

    数字列? 数字 0、1、2を用いた長さがnを越えない数字列は全部でいくつあるか? この問題は数字列ということなので012という数字列でもいいのでしょうか?よろしければ問題解説をお願いしたいです。 n>2のとき n^2n と(2n)^n どっちがおおきいか。 この問題は解き方がよくわからないのです…お願いしたいです。

  • VB 2005においての0から12までの値nを入力し、nと階乗n!値を

    VB 2005においての0から12までの値nを入力し、nと階乗n!値を表示させなさい。という問題が出ました。 色々調べてみたのですが、いまいち、ばらばらで要領を得ません。 プログラムに詳しい方どうか教えてくださいよろしくお願いします。

  • パソコンで階乗を計算

    現在、fortran90を使って階乗を計算するプログラムを作っております。 プログラム内容は、(n !を求めえるプログラム) n=0 do i=1,100 n=n*i enddo このプログラムを実行すると、12!までは予想された値が得られるのですが、13!以降は電卓で計算した値と遙かに異なる値が得られました。 このプログラムは間違っているとは思えないですが、電卓の計算とパソコンの計算が異なる結果になった理由が分かりません。 どなたか、ヒントや参考情報だけでもいいので教えてください。 ちなみにパソコンによる計算結果は、 i n 1 1 2 2 3 6 4 24 5 120 6 720 7 5040 8 40320 9 362880 10 3628800 11 39916800 12 479001600 13 1932053504 14 1278945280 15 2004310016 16 2004189184 17 -288522240 18 -898433024 19 109641728 20 -2102132736 21 -1195114496 22 -522715136 23 862453760 24 -775946240 25 2076180480 26 -1853882368 27 1484783616 28 -1375731712 29 -1241513984 30 1409286144 31 738197504 32 -2147483648 33 -2147483648 34 0 35 0 36 0 36の階乗以降0です。 計算結果が正となるが、結果が違うモノ(例えば、13!や31!)は単精度で約10桁程度しか有効数字が得られないためであると思われるのですが、負になったり、0になる理由が分かりません。

  • 極限と階乗

    なぜ分子のnの階乗が1、分母の2nの階乗が画像のようになるのですか?あと(n+1)が出現する理由は何ですか?

  • C言語の、階乗を使うプログラムの問題を教えて下さい

    C言語の、このプログラムを作るのが分かる方、教えて下さい。階乗を使う問題です。 「キーボードで整数aを入力するとn!>aとなるときの最小のnを出力するプログラムを作りなさい」という問題です。 分からず苦戦しています。 nをキーボードで入力してn!を求めるには #include<stdio.h> int main(void) { int kekka,n,i; printf("n=? \n"); scanf("%d",&n); kekka=1; for(i=1;i<=n;i++) { kekka=kekka*i; } printf("%d!は%dです。\n",n,kekka); return 0; } とすればいいのは自分で作れたのですが、問題にあるn!>aのプログラムが分からず困っています。 分かる方、お願いいたします

  • 階乗の出力について

    Cを勉強中の者です。再起コールを使った階乗計算の結果を出力するプログラムをつくったのですが、もし再起コール(関数 kaijyo)を使わずにfor文などを使って同じように、階乗計算を行いたい場合どのようにすればいいでしょうか? 以下がそのソースコードです。説明が不足であればまた付け加えますのでよろしくおねがいします。 #include <stdio.h> int kaijyo(int a); int main(void) { int a; a = kaijyo(6); printf("6! = %d\n", a); return 0; } int kaijyo(int n) { if(n == 1) return 1; else return n*kaijyo(n-1); /*これを使わずに6!の結果を出したい/* }

  • 階乗 総乗 

    階乗と総乗って同じことなのでしょうか? 違いはありますか? 数学的に厳密な定義は分かりませんが、 (nは自然数とする) 階乗:n!=n×(n-1)×・・・×2×1 総乗:Πkt[t=1~n]=1×2×・・・(n-1)×n と認識しています。 掛け算の順序が逆のように考えたのですが、 上の二つは同じものとして扱われていますか? 以上、ご回答よろしくお願い致します。

このQ&Aのポイント
  • 私は20年以上同居している人が最近とても怒りっぽいです。
  • 彼の言葉に主語がないため、会話が途中で混乱してしまうことがあります。
  • 彼は怒るとギャンブルをやりたがりますが、私には負けて自分を責めるような態度を取ります。
回答を見る