質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1093閲覧

カタラン数をC言語で求めたい。

hika2O21

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/01/22 05:57

実現したいこと
与えられた n に対するカタラン数 C_n を出力するプログラムを作りたいです。
n はコマンドライン引数として与えられます。
(n = 0, 1) C_n = 1         
(n>=2) C_n = Σ_{i=0}^{n-1} (C[i] * C[n-i-1])

コード

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int ni(int x) { 5 int a, result = 1; 6 for(a = 1; a < 2*x + 1; ++a) { result *= a; } 7 return result; 8 } 9int kai(int y) { 10 int b, result = 1; 11 for(b = 1; b < y + 2; ++b) { result *= b; } 12 return result; 13 } 14int fact(int z) { 15 int c, result = 1; 16 for(c = 1; c < z + 1; ++c) { result *= c; } 17 return result; 18 } 19int main(int argc, char *argv[]) { 20 int n; 21 n = atoi(argv[1]); 22if (n == 0) { 23 printf("%d\n", 1); 24 } else { 25 printf("%d\n", ni(n)/kai(n)/fact(n)); 26 } 27return 0 ; 28} 29

カタラン数C_n = (2n)!/(n+1)!n!で求めることができるので、初めに一つ一つの値を求めて、最後に式に当てはめるようにしました。
発生した問題
n = 6までは正しく求められていますが、 n = 7以降から違う値が出るようになりました。どこが原因なのかどうか教えてください。

C

1 ./a.out 1 21 3 ./a.out 2 42 5 ./a.out 3 65 7 ./a.out 4 814 9 ./a.out 5 1042 11 ./a.out 6 12132 13 ./a.out 7 146 15 ./a.out 8 160 17 ./a.out 9 180 19

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/01/22 06:04

具体的に、出る値と出るべき値を提示しましょう
y_waiwai

2022/01/22 06:07

そして、そのそれぞれにおいての各関数の戻り値を出力するようにして、それも提示してください
guest

回答2

0

ベストアンサー

n = 7 のとき (2n)! = 14! = 87,178,291,200 となる。
この値は、符号付き32bit整数の上限値 2^31 - 1 = 2,147,483,647 よりも大きい。

よって、関数 int ni(int x) は引数xが7以上のときはオーバーフローとなり、正しい演算結果を返さない。


カタラン数は漸化式で
C[0] = 1
C[1] = 1
C[n + 1] = (2(2n + 1) / (n + 2))・C[n]
と表すことができますので、再帰関数として記述すると良いように思われます。

【参考】カタラン数 - Wikipedia

投稿2022/01/22 06:14

編集2022/01/22 06:25
shsh_

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hika2O21

2022/01/22 06:46

コードの間違いではなかったのですね。なぜ正しい値が出ない理由を丁寧に解説していただいてありがとうございます。教えていただいた方法で記述してみようと思います。
guest

0

「カラタン数」というものについては初耳なので知りません。
またネットでちょっと検索してみましたが、全然違うものばかり出てきたのですぐ断念しました。

(n>=2) C_n = Σ_{i=0}^{n-1} (C[i] * C[n-i-1])

この定義の意味もちょっと理解できていません ({i=0}のあたり)。

以上前提での回答なので、見当はずれかもしれませんが...

おそらく、べき乗とか出てくるので、オーバーフローと思われます。
変数がすべてintで定義されているので32ビットと思われますが、
これを64ビットとかに修正して改善されれば、ビンゴです。

C言語の場合、64ビット変数の定義はお使いのコンパイラによって異なるので、調べてください。

64ビット変数に修正しても、べき乗を使っていることから、nの値を大きくするとまたすぐにオーバーフローする可能性があります。

投稿2022/01/22 06:13

yossie

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hika2O21

2022/01/22 06:48

教えていただきありがとうございました。64ビットとかに修正して、試してみようとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問