課題の指示の意味を汲み取りきれなかった自分が悪いのですが、
せっかくだから自分のやり方で最後までやってみたいと思っているので、
アドバイスよろしくお願いします。
【質問】
数学でいう組み合わせの問題の解き方で、
再帰ではなく
約分を使って解きたい(実装したい)のですがどのように取り組めばよいでしょうか。
今の自作ソースだと10とか20とか二桁台の入力でcombination関数内のjとkの値が膨大になって、
int型だと正常な結果が得られません。(jとkをint型にすることを目指しています)
課題を解きたいのではなく自分で考えた計算式を解きたいので、
題意を満たしていないとか言わないでいただければありがたいです。
以下は、正式な回答と、自分で解きかけた問題(約分ではなく力技)です。
参考までに、自分の解きかけた問題は変数の中身が見えるようにしたものも添付しておきます。
環境はwindowsXPでcygwinです。
正答(再起使用)
/* 異なるnこの整数からrこの整数を取り出す組み合わせの数nCrを求める関数 int combination(int n, int r){} を作成せよ。なおnCrは以下のように定義される。 nCr = (n-1)C(r-1) + (n-1)Cr (ただし、nC0 = nCn= 1,、nC1 = n) */ #include <stdio.h> int combination(int n, int r)//※仮引数はint型でないといけない { if(r==0||r==n) return (1); else if(r == 1); return(n); return (combination(n - 1, r - 1) + combination(n - 1, r)); } int main() { int i, j; puts("異なるn個からr個の整数の組み合わせの数を求めます."); printf("n:"); scanf("%d", &i); printf("r:"); scanf("%d", &j); printf("組み合わせの数は%dです.\n", combination( i, j) ); return 0; }
自力ソース
/* 異なるnこの整数からrこの整数を取り出す組み合わせの数nCrを求める関数 int combination(int n, int r){} を作成せよ。なおnCrは以下のように定義される。 nCr = (n-1)C(r-1) + (n-1)Cr (ただし、nC0 = nCn= 1,、nC1 = n) */ #include <stdio.h> int combination(int n, int r)//仮引数はint型でないといけない { int i;//ループ用変数 double j=1;//分子 double k=1;//分母 //int bunshi[n],bunbo[[/url];//なんとなく書いてみたのですが、配列の宣言に変数は使えないのですよね。 //(n-r)がr未満のときとr以上のときとそれ以外、 if( ( (n-r)<r ) && (n>=r) ){ for(i=r; i>0; --i){ j *= (n--); k *= (r--); } }else if( ( (n-r)>=r ) && (n>=r) ){ for(i=n; i>r; --i){ j *= (n--); } for(i=r; i>0; --i){ k *= (r--); } }else{ puts("n>=rで入力してください."); } return (j/k); } int main() { int i, j; puts("異なるn個からr個の整数の組み合わせの数を求めます."); printf("n:"); scanf("%d", &i); printf("r:"); scanf("%d", &j); printf("組み合わせの数は%dです.\n", combination( i, j) ); return 0; }
説明のために画像使うとファイルの添付ができないようですね。
(画像内の"="一つ余分でしたすみません)
(それ以前に字が汚くてすみません、数学の記号がうまく表せている自信が無かったので手書きしてみました)
添付は改めてさせていただきます。(あまり意味は無いかも知れませんが、一応)
よろしくお願いします。