→ tropical72:e^x = 1+x/1 + x^2/2! + x^3/3!+....+x^n/n!. 10/17 01:08
→ james732:1.先把數學公式找出來 2.想辦法把公式轉成程式 10/17 01:10
→ coilion9670:老師也給我們了公式但是我還是寫不出來QQ 10/17 01:13
→ tropical72:為表示誠意, 請先交上你的屍體. 10/17 01:14
→ james732:至少把公式貼上來吧,難不成還要板友自己找? 10/17 01:15
→ james732:對了,請善用大寫E修改文章... 10/17 01:17
※ 編輯: coilion9670 來自: 140.128.194.70 (10/17 01:21)
→ james732:那你可以先把階層的程式碼寫出來嗎?如果叫你算 5! 的話 10/17 01:23
→ biblegodbles:沒屍體的話建議去奇摩知識碰運氣 10/17 01:29
→ coilion9670:QQ 甚麼是階層的程式碼... 10/17 01:32
→ coilion9670:完全無解又不懂 :(((( 10/17 01:32
→ biblegodbles:意思是要你先寫一個計算階層的程式碼 例如input: 10/17 01:33
→ biblegodbles:output: 120 10/17 01:33
→ biblegodbles:input: 5! 10/17 01:34
→ james732:好吧,我先問,你希望板友引導你寫出來,還是想要答案? 10/17 01:46
→ coilion9670:想要答案還有我要懂為什麼 10/17 01:49
→ tropical72:(1) 1+2+3+...+n (2) 1/1+1/2+1/3+..+1/n,這兩題會嗎? 10/17 01:52
→ johnhmj:階乘是不是一定要用大數演算?我想到的只有這個 (._.?) 10/17 01:53
→ coilion9670:會! 10/17 01:53
→ tropical72:別忘了 e 是浮點數, 所以這裡的階乘用不到大數.. 10/17 01:54
→ tropical72:嗯, 那可以回文慢慢聊了.. 10/17 01:54
推 amozartea:其實cmath/maht.h裡面就有exp...不過不保證這樣寫有分 10/17 01:57
→ bigpigbigpig:大數?用不到吧?一直除的東西叫做小數,不需要大數 10/17 08:47
> -------------------------------------------------------------------------- <
作者: tropical72 (藍影) 看板: C_and_CPP
標題: Re: [問題] 計算 Exponential function 函數值
時間: Mon Oct 17 02:25:30 2011
※ 引述《coilion9670 (白熊)》之銘言:
: 開發平台(Platform): VC++
先來看第一個無聊的問題
(1) 1+2+....+n
int i, n, sum=0;
scanf("%d", &n);
for(i=1; i<=n; i++)
sum = sum+i;
(2) n!
階乘函數,它的狹益定義是: n! = n*(n-1)*(n-2)*...*1 ,
像 5! = 5*4*3*2*1 = 120,
所以先寫個 n! 之副函式,也由於用整數會溢位 (不知道溢位的話請 google),
所以用浮點數去存結果,下面是計算 i 階層函數大概長這樣 (不考慮負數情況)
int j, i=10;
double fact=1.0;
for(j=1; j<=i;j++)
fact = fact * j;
最後 fact 就是 10! (10階乘)
(3) 1/1 + 1/2 + 1/3 + ....+ 1/n
仿造問題 (1) 的 1+2+3+...+n, 只有一部份要修改而已。
int i, n, sum=0;
scanf("%d", &n);
for(i=1; i<=n; i++)
sum = sum + 1.0/i;
(4) 1+(1/1!+1/2!+1/3!+...+1/n!)
對照上面程式(2)與程式(3)
其中程式 (3) 只有一點小變化
int i, j;
int n=20; // 有 n 項
double fact; // 存 i 階乘
double sum=1.0; // 存 公式總合, 初始給 1.0
for(i=1; i<=n; i++) { // 有 n 個項次
// 算 i 階乘, 來自程式 (2)
fact=1.0;
for(j=1; j<=i; j++) fact = fact*j;
// 算倒數合,來自程式 (3)
// 程式 (3) : sum = sum + 1.0/i;
sum = sum + (double)i/fact;
}
最後 sum 的結果,就是你下面第一題的答案。
: 1) 撰寫一個程式計算數學常數e的趨近值。
: 1 1 1
: e= 1 + 一 + 一 + 一 + ....
: 1! 2! 3!
: 2) 寫一個程式計算e^x的值
: x x^2 x^3
: e^x = 1 + 一 + 一 + 一 + ...
: 1! 2! 3!
(5) 1+(x/1!+x^2/2!+x^3/3!+...+x^n/n!)
比照上面的程式 (4), 做以下修改
int i, j;
int n=20; // 有 n 項
double fact; // 存 i 階乘
double sum=1.0; // 存 公式總合, 初始給 1.0
double power; // 存 x 的 i 次方
double x=0.0;
printf("輸入 x 值 :"), scanf("%lf", &x);
printf("輸入 n 項 :"), scanf("%d", &n); // 這個可自己定 20~100試試
for(i=1; i<=n; i++) { // 有 n 個項次
// 算 i 階乘, 來自程式 (2)
fact=1.0;
for(j=1; j<=i; j++) fact = fact*j;
// 算 x 的 i 次方
power=1.0;
for(j=1; j<=i; j++) power = power * x;
// 算倒數合,來自程式 (3)
// 原本程式 (4) --> sum = sum + (double)i/fact; 換下面
sum = sum + power/fact;
}
printf("e^%d = %lf\n", x, sum);
---------
註
(1) 上面用的方法效率非常差,但適合初學者學習。
(2) 可調用 math.h 裡之 pow 協助完成,此處自己寫。
(3) 這題可以包三個副函式:power(算次方)、fact(算階乘)、ex(算 e^x),
考量沒學到副函式,所以全塞在主程式裡面。
(4) 基於考量初學者對 eps 概念不強,以定式 n 項方式寫,不以 eps 方式做收斂。
(5) If those codes can work, it was coded by me;
otherwise, I don't know who wrote those.
good luck.