はじめまして、ストレンジャーといいます。
以後お見知りおきを^^
課題で、(課題の内容をとりあえず丸写しします。(汗
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型の変数くらいです。
後はいろいろなアルゴリズムです。
答えてもらえやすいように書き込みしたつもりです!!
お願いします!!
二項定理?に関するもの
Re:二項定理?に関するもの
nCrは
comb1は再帰関数で、comb2は繰り返しで処理しています。
配列を使う云々はよくわかりませんが、パスカルの三角形の法則とかを使うんじゃないですかね、きっと。
[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:二項定理?に関するもの
こういう意味でしょうか。
#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:二項定理?に関するもの
少し整理しました。
#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:二項定理?に関するもの
回答ありがとうございます!
解決しました!といいたいところなのですが、
putcharとかcombiとかなどなどの意味がわかりません。
やはりそこは自分で調べて、
どういう形でプログラムを作ればいいかってことなんですかね?
自分が作ったプログラムを作りかけでも載せるべきだったんでしょうか。
反省しておきます。
解決しました!といいたいところなのですが、
putcharとかcombiとかなどなどの意味がわかりません。
やはりそこは自分で調べて、
どういう形でプログラムを作ればいいかってことなんですかね?
自分が作ったプログラムを作りかけでも載せるべきだったんでしょうか。
反省しておきます。
Re:二項定理?に関するもの
こんにちは。ストレンジャーさん。
遅くなってすみません。
putcharはただ単に1文字printfみたいに文字を表示する関数ですよ。
わからない関数名があればgoogleで検索すればたいてい解決します。
http://www.google.co.jp/search?hl=ja&q=putchar&lr=
combiなんて関数どこかに出てきました?
ただの配列名じゃないでしょうか。
justyさんのおつくりになったプログラムの中で出てくるのはただの自作関数名ですし。
遅くなってすみません。
putcharはただ単に1文字printfみたいに文字を表示する関数ですよ。
わからない関数名があればgoogleで検索すればたいてい解決します。
http://www.google.co.jp/search?hl=ja&q=putchar&lr=
combiなんて関数どこかに出てきました?
ただの配列名じゃないでしょうか。
justyさんのおつくりになったプログラムの中で出てくるのはただの自作関数名ですし。
Re:二項定理?に関するもの
justryさん、フリオさん、管理人さん
ありがとうございました!!
すごいですね!
こんな計算方法があったんだと
パソコンの前でなんかうなづいてしまいました。(汗
ありがとうございました!!
解決いたしました。
またわからないところがあったらよろしくお願いします!
ありがとうございました!!
すごいですね!
こんな計算方法があったんだと
パソコンの前でなんかうなづいてしまいました。(汗
ありがとうございました!!
解決いたしました。
またわからないところがあったらよろしくお願いします!