- 締切済み
n個からm個を取り出すプログラムでわかりません。
#include<stdio.h> int main() { int n; int m; int i; int kumi; int san; printf("n:"); scanf("%d",&n); printf("m:"); scanf("%d",&m); for(kumi=1,i=n;i>n-m+1;i--){ kumi=kumi*i; } for(san=1,i=1;i<=m;i++){ san=san*i; } printf("%d個の中から%d個を取り出す組み合わせは%dとおり\n",n,m,kumi/san); return 0; } 組合わせの値がおかしいです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- rnakamra
- ベストアンサー率59% (761/1282)
2箇所気になる点があります。 1.最初のforループ i=n~n-m+1までのm個についてこのループを実行するためには for(i=n;i>n-m;i--) でないといけません。tomo_ko_nさんのコードだと、i=n-m+1の場合はループが実行されません。 2.オーバーフローへの対処 nやmをある程度の数にすると簡単にオーバーフローします。 そのチェックはしておいたほうが良いでしょう。 #1にあるように掛け算と割り算を同じループ内で実行するとオーバーフローを起こしにくくなります。 また、m>n/2の場合は、m=n-mとしてから計算するとより速く計算できます。
- Tacosan
- ベストアンサー率23% (3656/15482)
「おかしい」とは「何がどのようにおかしい」のでしょうか? 具体的な例で, 「このような入力に対してこう期待されるのにこんなのが出てきた」と書いてみてください. #1 は超能力者か?
補足
取り出す組み合わせは%dとおりの所です。 例えばn=5、m=3だと、10になるはずなのになりません。
- asuncion
- ベストアンサー率33% (2127/6289)
#include <stdio.h> int main(void) { int combi, n, m, t, i; do { printf("n:"), scanf("%d", &n); printf("m:"), scanf("%d", &m); } while (n < m || m < 0); for (combi = i = 1, t = n; i <= m; n--, i++) { combi *= n; combi /= i; } printf("%d個の中から%d個を取り出す組み合わせは%dとおり\n", t, m, combi); return 0; }
お礼
参考になるプログラムありがとうございました。
お礼
わかりやすくてありがとうございました。