• 締切済み

やってみてもわからないので教えてください

組み合わせ(nCm)を計算するプログラムを作成せよ。 ただし、nの階乗を計算する関数factorialと組み合わせを計算する関数combinationを作成し、 関数combinationの中で関数factorialを使用して組み合わせを計算すること。 <実行結果> 組み合わせnCmを計算します。 nとmを入力してください(n>m) n --> 8 m --> 6 異なる8個の整数から6個の整数を取り出す組み合わせは28通りです。

みんなの回答

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.5

そんな勝ち組のあなたに.... #include <stdio.h> static __int64 tbl[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200, 1307674368000, 20922789888000, 355687428096000, 6402373705728000, 6402373705728000, 2432902008176640000}; static __int64 factorial(__int64 n) { return tbl[n]; } static __int64 combination(__int64 n, __int64 m) { return factorial(n) / factorial(m) / factorial(n - m); } int main(int argc, char* argv[]) { __int64 n, m; printf("組み合わせnCmを計算します。\n"); printf("nとmを入力してください(n>m)\n"); printf("n -->"); scanf("%lld", &n); printf("m -->"); scanf("%lld", &m); printf("異なる%lld個の整数から%lld個の整数を取り出す" "組み合わせは%d通りです。\n", n, m, combination(n, m)); return 0; } // ソースはここまで >nの階乗を計算する関数factorial 作成した >組み合わせを計算する関数combinationを作成し、 >関数combinationの中で関数factorialを使用して組み合わせを計算すること。 combinationの中でfactorialを使用している よって、題意は完全に満たされている 文句のつけようがないはずだ。 事前にテーブルで計算してあるので 非常に高速というおまけつきである。 まさに、勝ち組にふさわしい回答ではないか!!!

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

もちろん階乗を使って組み合わせの数を求める公式は存在するので, それをそのままプログラムに書くだけです. でも, 「階乗を使って組み合わせの数を求める」こと自体がしょぼいと思うのはなぜだろう. 普通, 階乗なんか使わないよなぁ. さておき, 「自分で考えてプログラムを作ることはしない」というのは「ある意味でよいプログラマ」だったりしますよね>#3. 何しろ, コピペでいく限り「世の中に存在するバグの数を増やすことは決してあり得ない」わけですし. ただまあ ・なんとしてでも答えを見つけるための検索能力 ・親切な友人を見つけるためのコミュニケーション能力 (資金力も含む) ・何も言わずに他人にさせるだけの権力 などのうち少なくとも 1つは必要な気がしますが.

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

>そういう質問の仕方だとちゃんと答えてくれませんよ。 こういう時のための捨てアカウントなんですよ。 誰かの質問に回答してありがとうポイントという評価を貯める必要もありませんし。 # 別人ですがLinuxカテで日に日に質問者の名前の数字がインクリメントされていく方もいましたし。 組み合わせの計算方法、もう忘れてしまいました。 計算式があったかと思われますので引数で受け取って結果を返せばよろしいでしょう。 # 自分でやらないのが勝ち組。 # 技術者としては負け組ですが、どうせ単位だけもらえりゃいいんですしね。

全文を見る
すると、全ての回答が全文表示されます。
noname#154655
noname#154655
回答No.2

以前も、短時間でいくつも質問さいれていませんでしたか? 名前が違いますけど。 そういう質問の仕方だとちゃんと答えてくれませんよ。 いい人は答えてくれますけど。 どこが分かって、どこが分からないかを書いた方が 答えてもらえると思います。 (途中までのプログラムも書く) 開発環境なども書かれた方がいいと思います。

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

http://okwave.jp/qa5011671.html http://okwave.jp/qa5011679.html http://okwave.jp/qa5011709.html http://okwave.jp/qa5011726.html と、この質疑。 課題の丸投げでしょうか? >やってみてもわからないので教えてください ということは、「とりあえずやってみた」のですよね? では、どこまで作成してどこがわからない(もしくは作成したが思い通りに動かない)貴方のソース提示してください。 他も同様。

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

関連するQ&A

  • nCrはどうあらわせばい??

    キーボードから二つの正の整数n,r を入力し,組み合わせの数nCr を計算して画面表示するプログラムを作成せよ.ただし,組み合わせの数を計算する関数のプロトタイプをint combination( int, int )とし,my_scanf()をキーボードから二つの正の整数n,r を入力する関数,kaijo() を階乗を求めるプログラムとする. という問題なんですが #include <stdio.h> int my_scanf(void){ int n; do{ scanf("%d",&n); }while(n <= 0); return n; } int kaijo(int m){ int i,x = m; for(i=1;i<m;i++){ x *= i; } return x; } int combination( int m, int w){ int ncr; ncr = m/w; return ncr; } int main (void){ int pos,sum_n,sum_r,answer; printf("n = "); pos = my_scanf(); sum_n = kaijo(pos); printf("r = "); pos = my_scanf(); sum_r = kaijo(pos); answer = combination(sum_n,sum_r); printf("nCr = %d",answer); return(0); } 結果的にはn!/r!を求めるプログラムに・・・・。 combination関数内を書き直せばいいのでしょうか?

  • プログラミング関係で

    プログラミングで次の問題をどうすればいいのかわかりません。 教えてください 1.配列に次のデータが格納されており、 2,-8,5,-4,6,5,7,-3,-9,-1 奇数、偶数、負の数がそれぞれいくつあるかを数え、表示するプログラムを作成してください。 2.任意の整数Xを入力し、Xの階乗の結果を表示するプログラムを作成しなさい。ただし、Xの階乗の計算は別関数で行い、入力と結果の表示はmain関数で行うようにすること。

  • 組合せ

    2個の整数m,n(m≧n)をキーボートから受け取って、m個の相異なる物の中からn個取り出す組合せの数を計算するプログラムを作っているんですが、下のプログラムだと、13の階乗でオーバーフローしてしまいました。combination関数を使わずに、13の階乗を計算したいのですが…。 13!/(k!(13-k)!)で、13!でオーバーフローなので、13!/k!=(k+1)×…×13を計算すればいいのは分かるのですが、どういう関数を定義すればいいのかわかりません。 ヒントやアドバイス頂けると、助かります。 よろしくお願いします。 #include <stdio.h> void main(void) {long m,n; long fact(long); while(scanf("%ld,%ld",&m,&n)!=EOF) printf("comb(%ld,%ld)=%ld\n",m,n, fact(m)/(fact(n)*fact(m-n))); } long fact(long k) {long i,f; f=1; for (i=1;i<=k;i=i+1) f=f*i; return(f); }

  • 再帰を用いた場合の計算量

    nの階乗を再帰呼び出しを用いて計算する以下のプログラムの計算量はいくらになるのでしょうか? 調べてみてもどこにも記述されていなくて困っています. int factorial(int n) {   if(n > 0)     return (n * factorial(n - 1));   else     return (1); } また,できれば求め方も教えていただけると嬉しいです.

  • Rubyのプログラムについて

    Rubyのプログラムについて、宜しければ教えてください。 def fct(n, f=1) if n<=1 then f else fct(n-1, n*f) end end def factorial(n) (1..n).inject{|x,y| x*y} end def factorial(n) eval( [*(1..n)].join("*") ) end このプログラムが、階乗を計算するメソッドになっているみたいなのですが、なぜコレだけで階乗が計算できるのでしょうか? 宜しければ教えてください><

    • ベストアンサー
    • Ruby
  • nCrの計算

    nCrの計算のプログラムを nCr=n!/(r!(n-r)!) を用いて再帰的関数を使って書いたのですが、もし nCr=n(n-1)(n-2)・・・(n-r+1)/r! であることを用いて、nからmまでの掛算を実現する2引数の関数を定義して、再帰的関数呼び出しを用いたnCrのプログラムを作成するとしたらどうなるでしょうか。 関数x!の定義は、関数の宣言をlong factorial(int x)として、 if (x==0) return(1); else return(x*factorial(x-1)); となることは分かるのですが、 2引数の関数m(m+1)・・・nはどう作れば良いのか全くわからないので、プログラムが書けない状態です。アドバイスお願いします。

  • 桁数が増えると正しく計算されません。

    今、Perlで作成したモジュールをCに移しています。 Perlではうまく動いているのですが、Cで作った以下のプログラムでは、 nを13以上にすると、値が正しく計算されなくなります。 ユーザ関数をdoubleにしたりすると、全て0になったりコンパイルできません。 せめてdouble型の最大値くらいまでは計算したいと考えています。 また、下のプログラムでC言語ならではの修正すべき点があれば教えてください。 よろしくお願いします。 #-----------------------------------------------------------# #include <stdio.h> int factorial(int j); int main(void) { /* 試行回数n回 */ int i, j, n, r, x; int combination; //printf("試行回数は?"); //scanf("%d", &n); n=13; for (i=1; i<=n; i++){ for (r=0; r<=i; r++){ combination = factorial(i) / (factorial(r) * factorial(i - r)); printf("%5d",combination); } printf("\n"); } } int factorial(int j){ int i; int x; x = 1; for (i = 1; i <= j; i++){ x *= i; } return x; } #-----------------------------------------------------------#

  • Nの階乗

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

  • C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに

    C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。 以下の点に留意して、階乗を計算するプログラムを作成する。 階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり 5の階乗:5×4×3×2×1=120 3の階乗:3×2×1=6 となります。 main内 1)整数型の変数kazu、kekkaを宣言する。 2)“階乗を計算します。”を表示する。 3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。 4)作成する関数名は、kaijyoとし、kazuを引数とし、戻り値をkekka に代入する。 6)“○の階乗は ○です。”と表示する。 関数kaijyo内 1)引数を変数名xとする。 2)整数型の変数i、valを宣言する。 3)計算結果をvalに入れていくために、valを初期化する(下記注意参照)。 4)iをカウンターとするfor文と複合代入演算子を使って階乗を計算する。 5)valの内容が戻り値となるようにする。 注意:階乗を計算するために、for文の中で複合代入演算子を使って階乗を計算します。しかし、for文に入る前のvalの初期化には注意が必要です。0に何を何回かけても0だと言うことを思い出してください。 という問題です。 それで私は下の通りに作りました。 #include <stdio.h> int kaijyo(int x); void main(void) { int kazu,kekka,kaijyo,sum; printf("階乗を計算します。\n"); printf("整数を入力してください"); scanf("%d",&kazu); kekka=kaijyo(kazu); printf("%dの階乗は%dです。",kazu,kekka); } int kaijyo(int x) { int i,val; val=1; x=1; for(i=1;i<=val;i++){ x=x*i; } return val; } しかし、メイクして実行してもどの階乗でも256になってしまいます。 どこが間違っているのか分からずに困っています。 よかったら教えてください。 よろしくお願いします。 カテゴリを間違ってしまっていたらすみません。

  • また、プログラミングで分からなくなったので、

    すみません、学校の課題(C言語)で 「任意の整数Xを入力し、Xの階乗の結果を表示するプログラムを作成しなさい。ただし、Xの階乗の計算は別関数で行い、入力と結果の表示はmain関数で行うようにすること。」 というのが出て、自分なりに作ってみたり、調べたのですが 別関数の意味やmain()の上の分に何が入るのかもわかりません。 それに下のプログラミングでちゃんと動くかもわからないです。 下に載せてみたので、よろしければ色々と言ってください。 お願いします #include<stdio.h> int { } main() { int kotae = 0; int kakezan,count,X; printf("整数Xを入力しなさい"); scanf("%d",&X); for(count = 0; count <= X; count++) { kotae = kakezan * X[count]; } printf("Xの階乗は%dです",kotae); }