/* Part5 演習問題5 */
/* 順列および組み合わせ */
#include <stdio.h>
int perm(int, int) ;
int comb(int, int) ;
int fact(int) ;

int main(void)
{
  int n,r ;

  printf("順列・組み合わせを計算するnとr(n≧r): ") ;
  scanf("%d %d",&n,&r) ;

  if((n<1)||(n>12)||(r<1)||(n<r)) {
    printf("nあるいはrの少なくとも一方が誤りです。\n") ;
    return(1) ;
  }
  printf("順列       %dP%d = %d\n",n,r,perm(n,r)) ;
  printf("組み合わせ %dC%d = %d\n",n,r,comb(n,r)) ;
  return(0) ;
}

/* 順列の計算(nPr) */
int perm(int n , int r)
{
  return(fact(n)/fact(n-r)) ;
}

/* 組み合わせの計算(nCr) */
int comb(int n, int r)
{
  return(fact(n)/(fact(n-r)*fact(r))) ;
}

/* 階乗の計算(n!) */
int fact(int n)
{
  if(n==0) return(1) ;
  else return(n*fact(n-1)) ;
}

% gcc -Wall part5-5.c

% ./a.out
順列・組み合わせを計算するnとr(n≧r): 2 4
nあるいはrの少なくとも一方が誤りです。

% ./a.out
順列・組み合わせを計算するnとr(n≧r): 4 2
順列       4P2 = 12
組み合わせ 4C2 = 6

% ./a.out
順列・組み合わせを計算するnとr(n≧r): 4 4
順列       4P4 = 24
組み合わせ 4C4 = 1


  1. 最初の例は,エラーデータを入力した例である.データに誤りがある場合は,計算を行わない.
  2. 2番目および3番目の例は,正しい値を入力した例である.
  3. int型のビット長は32ビットであるため,13!の結果は桁あふれとなる.よって,nは12以下でなければならない.