• 締切済み

困ってます…nCrを求めるC言語プログラミング

nCr、つまりn個のうちr個を取り出すときの場合の数を求めるプログラミングを作りたいのですが、どうもうまくいきません。 関数combinationを作って求めるという指定もあり、自分で出来るとこまで作ってみたのですが訳がわからなくなってしまい、かなり困っています…; コンパイルは出来るのですが実行してもセグメントエラーが出るばかりで… すみませんがご指摘していただけないでしょうか…? #include<stdio.h> //階乗を計算する関数 int fact(int num){ int i; if(num < 0){ return -1; } else if(num == 0){ return 1; } else if(num == 1){ return 1; } else { i = num * fact(num - 1); return i; } } //コンビネーションを計算 int combination(int n, int r) { int fact(int num); int i; i=fact(n)/fact(r)/fact(n-r); return combination(n-1, r-1)-combination(n,r-1); } int main(void) { int n, r; while ( printf("n r を入力して下さい。"), scanf("%d%d", &n, &r) == 2 ) { printf("nCr(%d,%d)=%d\n", n, r, combination(n, r)); } return 0; }

みんなの回答

  • TT414
  • ベストアンサー率18% (72/384)
回答No.5

>//コンビネーションを計算 >int combination(int n, int r) >{ >int fact(int num); >int i; >i=fact(n)/fact(r)/fact(n-r); >return combination(n-1, r-1)-combination(n,r-1); >} とありますが、int fact(int num);の行は文法上必要ありません。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

階乗計算は再帰じゃなくてループ実装の方がスタックの無駄遣いが少ないと思いますが、それはさておきcombinationの中で求めたiは既に答えじゃありませんか?

回答No.3

#include <stdio.h> int conb(int n, int r) { if(n < 0 || r < 0 || n < r) return 0; if(!r) return 1; return conb(n - 1, r - 1) + conb(n - 1, r); } int main(void) { int n, r; scanf("%d %d", &n, &r); printf("%dC%d = %d\n", n, r, conb(n, r)); return 0; }

回答No.2

> 実行してもセグメントエラーが出るばかりで… combination内でcombinationを呼び出しています。 脱出条件がどこにもないので無限に呼び出しを繰り返し、未来永劫帰ってこれません。 なのでセグメントエラー。 #include<stdio.h> int combination(int n, int r) { if ( n == 0 || r == 0 ) return 1; /* nCr = nCr-1 * (n-r+1)/r */ else return combination(n,r-1) * (n-r+1)/r; } int main() { int n = 6; int r = 2; printf("combination(%d,%d) = %d\n", n, r, combination(n,r)); return 0; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

combination の中で i をなぜ求めている?

関連するQ&A