• 締切済み

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; } 組合わせの値がおかしいです。

みんなの回答

  • rnakamra
  • ベストアンサー率59% (761/1282)
回答No.3

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としてから計算するとより速く計算できます。

tomo_ko_n
質問者

お礼

わかりやすくてありがとうございました。

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

「おかしい」とは「何がどのようにおかしい」のでしょうか? 具体的な例で, 「このような入力に対してこう期待されるのにこんなのが出てきた」と書いてみてください. #1 は超能力者か?

tomo_ko_n
質問者

補足

取り出す組み合わせは%dとおりの所です。 例えばn=5、m=3だと、10になるはずなのになりません。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

#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; }

tomo_ko_n
質問者

お礼

参考になるプログラムありがとうございました。

関連するQ&A