Thursday, July 29, 2010

ACM-369 Combinations with C++


/********************************/
/* This program is used to      */   
/*    calculate C(N,R)          */
/*                              */
/*                              */
/* First input is N ,           */
/*  and second is R             */
/* Output is the result of      */
/* C(N,R)                       */
/********************************/


#include <iostream>
using namespace std;
long double calculate(int n , int r);


int main(int argc, char* argv[])
{
 int N,R,temp;
 long double res;
 
 while(cin>>N>>R)
 {
  //the situation that stop the program
  if(N==0 && R==0)
  {
   break;
  }
  
  /********************************/
  /*  check                       */
  /*  if N!=R and R > N/2         */
  /*  then C(N,R) = C(N,N-R)      */
  /********************************/
  
  if(N != R && R > (N/2))
  {
   temp = N - R;
  }else
  {
   temp = R;
  }
  
  /* start to caiculate C(N,R) */
  res = calculate(N ,temp);
  printf("%d things taken %d at a time is %0.Lf exactly.\n",N,R,res);
 }
 return 0;
}


long double calculate( int n , int r)
{
 long double tempres = 1.0;
 
 if(n == r)
 {
  return 1;
 }
 else if(r == 1)
 {
  return n;
 }
 else
 {
  for(int i=1 ; i<=r ; i++)
  {
   tempres = (tempres * (n-r+i) / i) ;
  }
  return tempres;
 }
}





本來我用遞迴做

馬上就被賞了個TLE

還是乖乖的邊乘邊除

No comments: