キーボードから二つの正の整数n,r を入力し,組み合わせの数nCr を計算して画面表示するプログラムを作成せよ.ただし,組み合わせの数を計算する関数のプロトタイプをint combination( int, int )とし,my_scanf()をキーボードから二つの正の整数n,r を入力する関数,kaijo() を階乗を求めるプログラムとする.
という問題なんですが
#include <stdio.h>
int my_scanf(void){
int n;
do{
scanf("%d",&n);
}while(n <= 0);
return n;
}
int kaijo(int m){
int i,x = m;
for(i=1;i<m;i++){
x *= i;
}
return x;
}
int combination( int m, int w){
int ncr;
ncr = m/w;
return ncr;
}
int main (void){
int pos,sum_n,sum_r,answer;
printf("n = ");
pos = my_scanf();
sum_n = kaijo(pos);
printf("r = ");
pos = my_scanf();
sum_r = kaijo(pos);
answer = combination(sum_n,sum_r);
printf("nCr = %d",answer);
return(0);
}
結果的にはn!/r!を求めるプログラムに・・・・。
combination関数内を書き直せばいいのでしょうか?
No.7ベストアンサー
- 回答日時:
すいません間違えました。
nCrを階乗を使ってあらわすと
nCr = nPr / r!
nPm = n! / (n-r)!
プログラムに詳しくないので
良い例ではないと思いますが
少し変えさせていただきました。
#include <stdio.h>
int my_scanf(void){
int n;
do{
scanf("%d",&n);
}while(n <= 0);
return n;
}
int kaijo(int m){
int i,x = m;
for(i=1;i<m;i++){
x *= i;
}
return x;
}
int combination( int n, int r){
int ncr;
ncr = kaijo(n) / kaijo(n-r) / kaijo(r);
return ncr;
}
int main (void){
int n,r,answer;
printf("n = ");
n = my_scanf();
printf("r = ");
r = my_scanf();
answer = combination(n,r);
printf("nCr = %d",answer);
return(0);
}
No.9
- 回答日時:
No.6
- 回答日時:
nCrを階乗を使ってあらわすと
nCr = nPm / m!
nPm = n! / (n-m)!
という事を書けば良いんじゃないですかね?
間違ってたらすいません。
No.5
- 回答日時:
n!/r! ではなくて、どういう式になるのが
正しいのかはわかっているのでしょうか?
それがわかっていれば、悩む必要は無い気がします。
現状では、
sum_nを求めるのにも
sum_rを求めるのにも
同じ関数kaijo()を使用しているので、
n!/r! を求めてしまうのは当然だと思うのですが・・・
No.4
- 回答日時:
scanf()の戻り値をチェックするとよいと思います。
戻り値には読み込んだ変数の数が返されます。
数字の変わりにアルファベットを入力したら無限ループになるような気がします。
No.3
- 回答日時:
仕様に従えば、combination内で階乗するべきでは?
ncr = kaijo(m)/kaijo(w);
として、main関数内のkaijo()は不要。
------------------------------------------------
>my_scanf()をキーボードから二つの正の整数n,r を入力する関数
これも仕様に忠実に作るなら、
下記のような関数にするべきですね。
void my_scanf(int *n, int *r){
/*
この関数内で、n と r 両方に入力する。
scanfの記述が少し難しくなるかな。
n と r がポインタなので、下記はNGです。
scanf("%d %d", &n, &r);
ポインタの扱いに慣れていないと難しいかも。
課題ぽいので、答えは書きません。考えてみてください。
*/
}
------------------------------------------------
もう1つ、細かい指摘をすれば、
for(i=1;i<m;i++){
x *= i;
}
ここにも、ほんの少し無駄がありますよ。
No.2
- 回答日時:
#1です。
因みに、私なら
int combination( int m, int w){
return m/w;
}
にすると思います。
また、
「my_scanf()をキーボードから二つの正の整数n,r を入力する関数」
ということなので、my_scanf()を2回呼ぶのではなく、my_scanf()で2値の入力が完結するように変更すると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
卒業研究でよく分からないとこ...
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
C言語初心者です、、、お助けく...
-
【C++】関数ポインタの使い方
-
アスタリスクで正方形
-
インライン展開されているか確...
-
構造体の勉強中です 合計点の高...
-
異なる文字列のマッチングを、D...
-
数字列を3桁ごとにカンマで区切...
-
C言語 配列と関数の練習問題
-
C言語で三目並べをするプログラ...
-
入力を待たずにstdinの監視をし...
-
ファイルから読みこむ方法
-
課題でつまってます・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報