• 締切済み

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% (2126/6288)
回答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

  • C言語でmからnまでの合計を求めるプログラム

    これで動かないのですが、何が違っているのか、教えていただけますか。 #include <stdio.h> int main(void) { int m, n, sum, i, w ; printf("mからnまでの合計を求めます\n\n"); printf("m >> "); scanf(" %d", &m); printf("n >> "); scanf(" %d", &n); sum=0; if(m>n){ w=m; m=n; n=w; } sum=0; i=m; while(i<=n){ sum=sum+i; i=i+1; } printf("%d から %d の合計 = %d\n",m,n,sum); return 0; }

  • プログラム

    下のようなプログラムを作ったのですが、10進2進変換をj=n>>2&1の部分にあるようなビットシフトではなく、 for(i=1;i<8;i++){printf("bit[%d]=%d\n",i,n%2);n=n/2;}に変えて剰余計算で行うプログラムにしたいのですが、分かる方がいましたら教えて下さい。お願いします。 #include <stdio.h> int main(void) { int i,j,n; i=2; printf("数字を入力="); scanf("%d",&n); printf("Dec=%d\n",n); printf("heX=0x%x\n",n); j=n>>2&1; printf("bit[%d]=%d\n",i,j); return(0); }

  • 非負整数nを読み込んで、1+2+・・・+m>nとなる最小の整数mを表示

    非負整数nを読み込んで、1+2+・・・+m>nとなる最小の整数mを表示するというプログラミングなのですが・・・ #include <stdio.h> int main(void) { int n,m=■ , sum=0; do { printf("非負整数: "); scanf("%d", &n); } while (n■0); while (sum■n) { ■ ; sum +=■; } printf("1+2+・・・+m> %dとなる最小の整数mは%dである。\n", n, m); return (0); } ■のところがわかる方どうにかお願いします!!

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

  • c言語 行列のn階乗のプログラム

      1 2 -1 D= 3 0 -2   -1 1 2 の3次正方行列のn乗を計算するプログラムを作成しています。 いろいろと試してみましたがうまくいきません。 どなたか教えていただけるとうれしいです。 よろしくおねがいします。 #include <stdio.h> int main(void) { int a[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int b[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int s[3][3]; int m,n; int i,j,k; printf("[A]^n;n = ");scanf("%d",&n); for (m=2;m <= n;m++){ for (i=0;i<3;i++){ for (j=0;j<3;j++){ s[i][j] = 0; for(k=0;k<3;k++){ s[i][j] =s[i][j] + a[i][k] * b[k][j]; } } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ b[i][j]=s[i][j]; } } printf("%3d",s[i][j]); putchar('\n'); } return (0); }

  • プログラムの練習問題をやっていたのですが、練習問題の答えのような実行結

    プログラムの練習問題をやっていたのですが、練習問題の答えのような実行結果にならないので教えていただけませんか? 下記に記したプログラムを実行すると x=9 y=-9 [ 9]*[-9]=[ -81],[ 9]*[-8]=[ -72],[ 9]*[-7]=[ -63],・・・・ ・・・・ [10]*[-9]=[ -90],[10]*[-8]=[-80],・・・・ ・・・・ のようになるのですが、 x=9 y=-9 [ 9]*[-9]=[ -81],[10]*[-9]=[-90],・・・ [ 9]*[-8]=[ -72],[10]*[-8]=[-80],・・・ [ 9]*[-7]=[ -63],・・・ ・・・・ のようにするためにはどうすればいいですか? #include <stdio.h> int main(void) { int x,y,m,n; printf("x="); scanf("%d",&x); printf("y="); scanf("%d",&y); for(m=x;m<=x+3;m++) { printf("\n"); for(n=y;n<=y+14;n++) { printf("[%2d]*[%2d]=[%4d],",m,n,m*n); } printf("\n"); } return(0); }

  • 昇順に並べ替えるプログラム(続き)

    (C言語)実行例のような3つの整数を読み込み昇順に並べ替えるプログラムは途中までわかったのですがあとはどう修正・追加をすればいいのでしょうか? 実行例 1:45 2:43 3:38 昇順に並べ替えました。 1:38 2:43 3:45 途中までのプログラム #include<stdio.h> int main(void) { int n1,n2,n3; printf("1:"); scanf("%d",&n1); printf("2:"); scanf("%d",&n2); printf("3:"); scanf("%d",&n3); printf("昇順に並べ替えました。\n"); return 0; }

  • おみくじプログラムですがじっこうできません。

    #include<stdio.h> int main() { int i; char data[5][10]={"大吉","小吉","吉","凶","大凶"}; printf("1~5の間の整数を入力:"); scanf("%d",&i); while(i<1&&i>5){ printf("入力値が不適切です。\n"); printf("1~5でお願いします。\n"); scanf("%d",&i); } printf("%s\n",data[5][i-1]); return 0; } 自分で考えてみたのですが、どうしたらいいかわかりません。

  • プログラムの作成

    Cで、キ-ボ-ドから整数を1個(mとする)、実数を1個(xとする)それぞれ入力し、 S=Σ(n=0からmまで)1/2n+1×(x-1/x+1)^2n+1 の値を求めるプログラムを作ってみたのですが、あってるかどうかわかりますか? #include<stdio.h> #include<math.h> main() { double y=0; int i,m,x; printf(\" Input m: \") scanf(\"%lf\", &m); printf(\" Input x: \") scanf(\"%lf\", &x); for(i=0; i <= m; i++) { y += 1/(2*i+1)*pow((x-1)/(x+1),2*i+1) } printf(\" S = %d\n\", y) }

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

専門家に質問してみよう