プロが教える店舗&オフィスのセキュリティ対策術

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

組合わせの値がおかしいです。

A 回答 (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としてから計算するとより速く計算できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/28 19:37

「おかしい」とは「何がどのようにおかしい」のでしょうか?


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

この回答への補足

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

補足日時:2009/05/28 19:32
    • good
    • 0

#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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/28 19:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!