- 締切済み
この計算プログラムの書き方を教えてください.
C++で,次の式の計算プログラムを書きたいのですが,今ひとつ(というか全く)分かりせん. どなたか,教えていただけないでしょうか.できたら,ソースを書いていただけると嬉しいです... P0 = (Σ(n=0からc-1まで)a^{n}/n! + a^{c}/((c-1)!(c-a)))^{-1} です. cの値を0から100まで変化させたときの,P0の値を求めたいので,for文つかって,あとは結果を加算してったいらいいんでしょうが,階乗が入ってきてしまい,全く分からなくなってしまいました... ちなみに,aは定数なので,そのままで構わないと思います. プログラマの方,よろしくお願いしたします.
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- net-in
- ベストアンサー率12% (1/8)
べき乗は <math.h> のなかに pow( x, y ) : xのy乗 があったと思いますよん
- hiroyapapa
- ベストアンサー率45% (17/37)
大切なことから書きます。 式の中にとてつもなく大きな数値になるものが含まれていますよね。例えば、99!とか、(aがいくつなのかによりますけど) a^100とか。 C/C++の整数型の変数だけではまかないきれません。 浮動小数点を使用したら何とかなりますが、今度は桁落ちなどを考慮する必要があります。果たしてあなたの期待している精度が保てるかどうか... 以上を無視して、単純に論理部分だけ書くと以下のように作る方法があります。 (1)階乗を計算する関数を用意する。 double fact(int x); *中身はご自身で考えてくださいね。 (2)べき乗を計算する関数を用意する。 double pow(int x, int y); *中身はご自身で考えてくださいね。 (3)本体 const int a = 10; // 定数aです。 for(int c=1; c<=100; c++) { double p = 0; // シグマの計算 for(int n=0; n<c; n++) { p = pow(a, n)/fact(n) + pow(a, c)/(fact(c-1)*(c-a)); } // その逆数がcを与えたときのP0 printf("P0(C=%d) = %f\n", 1/p); } 参考まで。
- yomo3
- ベストアンサー率32% (88/269)
すぐに回答が欲しいと言うことなので、とりあえず。 コードを全て核余裕がないので、階乗部分のヒントだけで許してください。 適当な変数(nkaiとか)にforループの外側で1を代入。 forループの最初に nkai=nkai*n; という行を入れる。 この値がn!になります。
お礼
ありがとうございます. なんとなく分かるのですが,これを実装するとなるとまだよく分かりません...すみません... コードを書いていただけるなら時間が多少かかっても大丈夫なので,細かく教えていただけないでしょうか?
お礼
ありがとうございました. なんとかできました. ですね,確かに階乗計算で100!ってのは ありえないですよね(汗). なので,とりあえず10!ぐらいまでにして おきました. 本当にたすかりました. これからも何かありましたら,アドバイスよ ろしくお願いいたします.