二項定理?に関するもの

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ストレンジャー

二項定理?に関するもの

#1

投稿記事 by ストレンジャー » 17年前

はじめまして、ストレンジャーといいます。
以後お見知りおきを^^

課題で、(課題の内容をとりあえず丸写しします。(汗
n個からr個を取る組合せの数nCrについて、次の関係がある。
・ nCr = n-1Cr-1 + n-1Cr
・ nC0 = 1, nCn = 1
上記の関係を用いて、プログラム中の記号定数Nについて、nCr (n = 1, 2, …, N)
の表を出力するプログラムをつくりなさい。たとえば、Nが5であるとき、
以下のように出力されることが期待される。
1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

 なお、このプログラムは二次元配列を利用すると簡単に作れる。
しかし、計算の手順を工夫することで、N + 1この要素を持つ1次元配列のみで行う方法、
両方について考えて見なさい。
こんなのがでたんですはい。
nCr = n! / {(n - r)! * r!}だから、
うえの公式を使って考えて、
nCr = (n - 1)! / { (n - r)! * (r - 1)! } + (n - 1)! / { r! * (n - r - 1)! }
だ!とか思いまして、階乗の部分の計算式を立てようとがんばっていたんですが、
なんかものすごーいことになってしまいまして、(汗
なんかわかんないのがなんなんだかわかんないです・・;
ということで答えていただきたいです^^
こういうことを掲示板に張るのが初めてなので、
何かいたらいいかわかんないんですが、
とりあえず、今まで習ったのはprintf(),scanf(),if,for,whileループ,do whileループ
配列変数(1次元、二次元),sqrt()とか、double型、float型,int型の変数くらいです。
後はいろいろなアルゴリズムです。
答えてもらえやすいように書き込みしたつもりです!!
お願いします!!

Justy

Re:二項定理?に関するもの

#2

投稿記事 by Justy » 17年前

 nCrは
[color=#d0d0ff" face="monospace]typedef unsigned int    uint32;
static uint32 comb1(uint32 n, uint32 r)
{
    if (r == 0 || r == n) return 1;
    return comb1(n - 1, r - 1) + comb1(n - 1, r);
}
static uint32 comb2(uint32 n, uint32 r)
{
    uint32 i, p = 1;
    for(i=1; i<=r; ++i)
        p = p * (n+1-i) / i;
    return p;
}[/color]
 で、comb1でも comb2のどちらでも解けます。
 comb1は再帰関数で、comb2は繰り返しで処理しています。

 配列を使う云々はよくわかりませんが、パスカルの三角形の法則とかを使うんじゃないですかね、きっと。

フリオ(元通りすがり)

Re:二項定理?に関するもの

#3

投稿記事 by フリオ(元通りすがり) » 17年前

 
 こういう意味でしょうか。
#include <stdio.h>

#define N 5

int main(void)
{
    int n, r;
    int combi0[N + 1][N + 1], combi1[N + 1];
    
    for(n = 0; n <= N; n ++){
        for(r = 0; r <= n; r ++){
            if(r == 0 || n == r) combi0[n][[/url] = 1;
            else combi0[n][[/url] = combi0[n - 1][r - 1] + combi0[n - 1][[/url];
        }
    }
    for(n = 0; n <= N; n ++){
        for(r = 0; r <= n; r ++) printf("%d ", combi0[n][[/url]);
        putchar('\n');
    }
    for(n = 0; n <= N; n ++){
        for(r = n; r >= 0; r --){
            if(r == 0 || n == r) combi1[[/url] = 1;
            else combi1[[/url] += combi1[r - 1];
        }
        for(r = 0; r <= n; r ++) printf("%d ", combi1[[/url]);
        putchar('\n');
    }
    return 0;
}
 

フリオ(元通りすがり)

Re:二項定理?に関するもの

#4

投稿記事 by フリオ(元通りすがり) » 17年前

 
 少し整理しました。
#include <stdio.h>

#define N 5

int main(void)
{
    int n, r;
    int combi0[N + 1][N + 1], combi1[N + 1];
    
    for(n = 0; n <= N; n ++){
        combi0[n][0] = combi0[n][n] = 1;
        if(n) printf("%d ", combi0[n][0]);
        for(r = 1; r < n; r ++){
            combi0[n][[/url] = combi0[n - 1][r - 1] + combi0[n - 1][[/url];
            printf("%d ", combi0[n][[/url]);
        }
        printf("%d\n", combi0[n][n]);
    }
    for(n = 0; n <= N; n ++){
        combi1[n] = combi1[0] = 1;
        for(r = n - 1; r > 0; r --) combi1[[/url] += combi1[r - 1];
        for(r = 0; r <= n; r ++) printf("%d ", combi1[[/url]);
        putchar('\n');
    }
    return 0;
}
 

ストレンジャー

Re:二項定理?に関するもの

#5

投稿記事 by ストレンジャー » 17年前

回答ありがとうございます!
解決しました!といいたいところなのですが、
putcharとかcombiとかなどなどの意味がわかりません。
やはりそこは自分で調べて、
どういう形でプログラムを作ればいいかってことなんですかね?
自分が作ったプログラムを作りかけでも載せるべきだったんでしょうか。
反省しておきます。

管理人

Re:二項定理?に関するもの

#6

投稿記事 by 管理人 » 17年前

こんにちは。ストレンジャーさん。
遅くなってすみません。

putcharはただ単に1文字printfみたいに文字を表示する関数ですよ。

わからない関数名があればgoogleで検索すればたいてい解決します。

http://www.google.co.jp/search?hl=ja&q=putchar&lr=

combiなんて関数どこかに出てきました?
ただの配列名じゃないでしょうか。

justyさんのおつくりになったプログラムの中で出てくるのはただの自作関数名ですし。

ストレンジャー

Re:二項定理?に関するもの

#7

投稿記事 by ストレンジャー » 17年前

justryさん、フリオさん、管理人さん
ありがとうございました!!
すごいですね!
こんな計算方法があったんだと
パソコンの前でなんかうなづいてしまいました。(汗
ありがとうございました!!
解決いたしました。
またわからないところがあったらよろしくお願いします!

閉鎖

“C言語何でも質問掲示板” へ戻る