- 締切済み
困ってます…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; }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- TT414
- ベストアンサー率18% (72/384)
>//コンビネーションを計算 >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)
階乗計算は再帰じゃなくてループ実装の方がスタックの無駄遣いが少ないと思いますが、それはさておきcombinationの中で求めたiは既に答えじゃありませんか?
- yaemon_2006
- ベストアンサー率22% (50/220)
#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; }
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 実行してもセグメントエラーが出るばかりで… 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)
combination の中で i をなぜ求めている?