/* 漸化式(nCrの計算)
n個の中からr個を選ぶ組み合わせの数 nCrを求める.

nCr=(n-r+1)/r nC_{r-1}
nC0=1

0C0=1  
1C0=1  1C1=1  
2C0=1  2C1=2  2C2=1  
3C0=1  3C1=3  3C2=3  3C3=1  
4C0=1  4C1=4  4C2=6  4C3=4  4C4=1  
5C0=1  5C1=5  5C2=10  5C3=10  5C4=5  5C5=1
*/

#include 

long combi(int,int);

main()
{
    int n,r;

    for (n=0;n<=5;n++) {
        for (r=0;r<=n;r++)
            printf("%dC%d=%ld  ",n,r,combi(n,r));
        printf("\n");
    }
}
long combi(int n,int r)
{
    int i;
    long p=1;

    for (i=1;i<=r;i++)
        p=p*(n-i+1)/i;
    return p;
}


/* Hornerの方法 
多項式 f(x)=a_n x^n + a_{n-1}x^{n-1}+ ... + a_1x+a_0
の値を Hornerの方法を用いて計算する。

f_i=f_{i-1}x+a_{n-i}
f_0=a_n

fn(1.000000)=15.000000
fn(2.000000)=129.000000
fn(3.000000)=547.000000
fn(4.000000)=1593.000000
fn(5.000000)=3711.000000

f(x)=5x^4+4x^3+3x^2+2x+1

*/

#include 

double fn(double,double *,int);

main()
{
    static double a[]={1,2,3,4,5};    /* 係数 */
    double x;

    for (x=1;x<=5;x++)
        printf("fn(%f)=%f\n",x,fn(x,a,4));
}
double fn(double x,double a[],int n)
{
    double p;
    int i;

    p=a[n];
    for (i=n-1;i>=0;i--)
        p=p*x+a[i];
    return p;
}


/* Pascalの三角形 

nCr={n-1}_C_{r-1}+{n-1}_C_r
                                     1   
                                   1     1   
                                1     2     1   
                             1     3     3     1   
                          1     4     6     4     1   
                       1     5    10    10     5     1   
                    1     6    15    20    15     6     1   
                 1     7    21    35    35    21     7     1   
              1     8    28    56    70    56    28     8     1   
           1     9    36    84   126   126    84    36     9     1   
        1    10    45   120   210   252   210   120    45    10     1   
     1    11    55   165   330   462   462   330   165    55    11     1   
  1    12    66   220   495   792   924   792   495   220    66    12     1  
*/

#include 
#define N 12

long combi(int,int);

main()
{
    int n,r,t;

    for (n=0;n<=N;n++){
        for (t=0;t<(N-n)*3;t++)        /* 空白 */
            printf(" ");
        for (r=0;r<=n;r++)
            printf("%3ld   ",combi(n,r));
        printf("\n");
    }
}
long combi(int n,int r)
{
    int i;
    long p=1;

    for (i=1;i<=r;i++)
        p=p*(n-i+1)/i;
    return p;
}



Back to C Language

Google




BLOG
PICASAWEB
Panoramio


REF:


C言語によるはじめてのアルゴリズム入門