精華區beta C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): VC++ 問題(Question): 1) 撰寫一個程式計算數學常數e的趨近值。 1 1 1 e= 1 + 一 + 一 + 一 + .... 1! 2! 3! 2) 寫一個程式計算e^x的值 x x^2 x^3 e^x = 1 + 一 + 一 + 一 + ... 1! 2! 3! 老師出這兩題有沒有大神能幫一下 完全沒頭緒這程式的寫法 小弟現在大一剛學C++ 希望有人能幫我解惑' 感謝 Oㄇ_ 剛剛沒把公式key上來抱歉 小弟馬上補!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.128.194.70
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.