2012年2月8日水曜日

SONY GO FOR IT 2問目:実数の階乗

1)問題文


ある検索サイトに5!と入力するとその計算結果である120が表示されます。
その検索サイトに2.5!と入力するとなんと3.32335097と表示されます。
さらにその検索サイトに(-1.9)!と入力すると-10.5705641と表示されます。
きっとそれらの仕組みはとても難しくて企業秘密に違いないので是非ともこれらを実行するプログラムを作ってほしい。
ただし、君のPCは古いのでネットワークや便利で高度な数学関数は入っていません。
入っている数学関数はsin,cos,tan,log,pow,floorなどの初歩的な関数のみです、残念ながら。
                                                                                                                              
i)入力された整数a(0<=a<=10)の階乗を求めるプログラムを作ってください。
ii)入力された実数a(0<=a<=10)の階乗を求めるプログラムを作ってください。
iii)入力された実数a(-1.9<=a<=-1.1)の階乗を求めるプログラムを作ってください。

2)解き方
ガンマ関数使います。上手く関数が動いているかの答え合わせはグーグルに聞くと良いでしょう。
-の時は(-1.6)!としないと私みたいに頭抱えます・・・。
ガンマ関数と、対数ガンマ関数を用いて計算を行います。
また、マイナスの際は、サイン関数とガンマ関数の関係式から変換をしてください。

3)疑問点
 特に無いです。カッコ付けずにグーグルに質問して焦っていたぐらいです。
ガンマ関数のいい勉強になりました。

4)苦労したところ
 式が汚い。カッコが多くなってしまって、何処が何処を優先しているか分かりづらくなってしまったが動いたから放置している。これはマズイと思う。

5)ライセンス
 BSDラインセンス

6)出力ファイル
1)入力された整数a(0<=a<=10)の階上
5を入力
120
2)入力された実数a(0<=a<=10)の階上
4.5を入力
52.3427777845535
3)入力された実数a(0<=a<=10)の階上
11.5を入力
範囲外
4)入力された実数a(-1.9<=a<=-1.1)の階上
-1.8を入力
-5.7385546399985
5)入力された実数a(-1.9<=a<=-1.1)の階上
-1.45を入力
-3.5913872638524

7)ソースファイル
今回は短いだろうってことで、一個のファイルにまとめた。
プログラム
ソースなんですが、return 0付け忘れています。
テストコードを消した際に一緒に消しちゃったっぽいですよん。