
No.7ベストアンサー
- 回答日時:
プログラムというより、どちらかというと数学の問題ですね。
Σ{i=0→n} 1/i! の値はよく知られているように、nが無限大の時にネイピア数(自然対数の底)eになります。
nがある値以上の場合には有効桁数が溢れて演算が無効になりますからその時はeを返せばよいということです。
有効桁数が溢れて演算が無効になるnをn_MAXとおくと、
#include <math.h>
if (n > n_MAX) return(M_E);
となります。M_Eはコンパイラが提供するネイピア数です。n_MAXは処理系固定なので予めプリプロセッサで計算しておくか、定義しておきます。
つぎに計算量を小さくする工夫が必要です。上記のようにn_MAXを求めておいた場合には
nがn_MAXに近い場合には減算した方が速いので処理を分離します。
// n_MAX!は予め計算しておくこと
#define fact_MAX = 1.0/(double)(n_MAX!);
if (n > (n_MAX - n)) {
double s, fact;
int i;
// s = Σ{i=n+1 → n_MAX} 1/i! の計算
s = fact = fact_Max;
for (n += 1, i = n_MAX; i > n ; i--) {
fact *= (double)i;
s += fact;
}
return(M_E - s);
}
以下は他の回答者の方を参考にしてみてください。
お礼が遅れてしまい申し訳ありません。
みなさんのおかげでなんとか解決する事ができました。
まだこれからもC言語を勉強していくつもりなので壁に当たった時はよろしくおねがいします。m(_ _)m
No.6
- 回答日時:
#include <stdio.h>
int main(void)
{
double s;
int n, f, i;
do {
printf("n="), scanf("%d", &n);
} while (0 > n || n > 33);
for (s = f = i = 1; i <= n; i++) {
s += 1. / (f *= i);
}
printf("%.15f\n", s);
return 0;
}
No.4
- 回答日時:
0!の逆数を合計に足し込む。
1!の逆数を合計に足し込む。
2!の逆数を合計に足し込む。
...
n!の逆数を合計に足し込む。
のように、0~nについて毎回階乗を求めるのは
ひじょうに効率が悪いです。
nが1以上のときの階乗は、それより1個前の階乗(初期値は0!=1)を
すでに求めているのですから、それにnを掛ければよいだけですね。
お礼が遅れてしまい申し訳ありません。
みなさんのおかげでなんとか解決する事ができました。
まだこれからもC言語を勉強していくつもりなので壁に当たった時はよろしくおねがいします。m(_ _)m
No.3
- 回答日時:
>入力された整数n
整数を入力させる方法はわかっていますか?
わからなければ、本読んだり、ここの他の質問を読んでみるなりして調べてみてください。
でも、とりあえず、
int n ;
n=10 ;
とかして、数値入れておいて、数値変えるたびにコンパイルすれば、Σの部分の確認はできます。
あとまわしでいいです。
> Σ{i=0→n} 1/i!
どんな式でも受けつけるΣを計算するような関数は標準では用意されていません。
ですので、Σの意味を考えてプログラムで実現します。
関数f(i)について
Σ(i=0→n) f(i) =f(0)+f(1)+...+f(n)
ですよね?
これは
a=0;
i=0 ; a += f(i);
i=1 ; a += f(i);
...
i=n ; a += f(i) ;
とした後の aの値ですよね?
任意のnについて上の計算をするとして、便利な命令がCにはあった筈です。よく思い出してみましょう。
また、
n! = 1 (n=0のとき) , (n-1)! * n (n>0のとき)
というのも覚えてますか?
注意点として、 Cでは 整数÷整数は整数(小数点以下切り捨て)になる、ということです。
1/i! を 双方int型のままで計算しようとすると、 0か1にしかなりません。
このような場合は、型変換を利用して、実数型(精度を考えれば、doubleがよい)にします。
お礼が遅れてしまい申し訳ありません。
みなさんのおかげでなんとか解決する事ができました。
まだこれからもC言語を勉強していくつもりなので壁に当たった時はよろしくおねがいします。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby VBA 2 2023/01/14 14:14
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- 数学 数学の質問 6 2022/08/28 07:49
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 高校 勉強ができない。 4 2022/07/03 08:13
- C言語・C++・C# c言語について 下記の計算結果を出力するコードを記述する問題で 0-4 3.14×2 5÷3 30÷ 5 2022/05/17 22:41
- 簿記検定・漢字検定・秘書検定 20代前半 漢字検定を受けたい者です。 私は、今まで漢字が嫌いで勉強から逃げて来ました。 今になって 4 2022/08/17 00:21
- 簿記検定・漢字検定・秘書検定 簿記3級を独学で勉強した人に質問です。 どうやって勉強しましたか?私は今独学で勉強中ですが、なかなか 3 2023/01/25 00:01
- 高校受験 数学の問題いくつか捨てても大丈夫?残り1ヶ月、点数が取れない教科ばっか勉強しても大丈夫? 高校受験 2 2023/01/07 17:55
- その他(悩み相談・人生相談) 質問を開いてくれてありがとうございます。 転職で資格を取りたくて悩んでいます。 取りたい資格とはフォ 2 2022/04/05 17:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
Word2007 図の属性一括変更(行...
-
エクセルマクロで計算結果の値...
-
アルゴリズムの時間計算量、空...
-
RSA暗号解読
-
電卓作成(緊急です!!)
-
チューリングマシンの状態数に...
-
円形ボリュームのUIの実装方法
-
Matlabでのニュートン法について
-
万年暦を導き出すプログラミング
-
チューリングマシンの限界について
-
プログラミングの言い回しを教...
-
VB2008で小数点以下3桁を表示...
-
パチンコゲームを作りたいので...
-
グラフの描き方
-
表示アプレットと計算用プログ...
-
色々な計算をさせる為に、プロ...
-
等高線を計算したい
-
プログラム初心者の質問です ア...
-
G3とG4の違いは何でしょうか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
変化させるセルが変化しない
-
エクセルで特定のセルのみを任...
-
CとFORTRANの計算速度はどちら...
-
モジュロ
-
バッチファイルでウインドウを...
-
Visual C++でdebugとreleaseで...
-
y=(x^2 +3x+1)^4を微分の定義を...
-
入射角反射角
-
スレッド処理からダイアログを...
-
60進数の四則計算
-
Javaと他言語比較について
-
VBAで関数をつくる
-
C言語 Σをつかったプログラム
-
CRC8を教えてください
-
C言語についてです。 再帰を使...
-
C言語について 下の画像は do-w...
おすすめ情報