2014-02-10 38 views
2

我正在進行一個階乘總和,如:1/1!+1/2!+1/3!...,直到達到所需的數量。這裏是我的代碼到目前爲止:因子分數之和

#include <stdio.h> 
int factorial(int n) 
{ 
    if (n==0) 
     return 1; 
    else 
     return 1/(n * factorial(n-1)); 
} 
int main() 
{ 
    int i, n; 
    float sum=0; 
    printf("Enter desired factorial fraction: "); 
    scanf("%d", &n); 
    for (i=1; i<=n; i++) sum = sum + factorial(i); 
    printf("The value is %f\n", sum); 
    return 0; 
} 

我有一個小想法,我在做什麼,我真的很新。我的思考過程是設置數字計算函數(我的行話可能是關閉的),然後啓動主函數。我以爲我有權利設置,但幾個小時後,我覺得失去了。任何幫助和指導將非常感謝。

更新

下面是更新後的代碼:

#include <stdio.h> 
float factorial(int n) 
{ 
if (n==1) 
return 1; 
else 
return ((1.0/n) * factorial(n-1.0)); 
} 
int main() 
{ 
float i, n; 
float sum=0; 
printf("Enter desired factorial fraction: "); 
scanf("%f", &n); 
for (i=1; i<=n; i++) sum = sum + factorial(i); 
printf("The value is %f\n", sum); 
return 0; 
} 

所以,謝謝你們,現在唯一剩下的東西是我要弄清楚爲什麼我的「0」輸入不產生結果因爲0!= 1,所以「1」。我應該如何移動「int main()」中的if語句?

+0

我想你理解錯了....小編號和調試運行一下,看看...... – Dani

+0

一個輕微的評論。大數的階乘會導致溢出錯誤。它更好地通過使用for循環直接找到1.0/factorial(n)。像'd = 1;對於(i = 1; i <= n; i ++)d/= i;'。對於較大的'n',這應該接近0.記住要檢查'n == 0'等等... – ssm

回答

0

factorial()必須是這樣的

int factorial(double n) 
{ 
    if (n==0) 
     return 1; 
    else 
     return ((1/n) * factorial(n-1)); 
} 
+1

返回值應該是'float'而不是'int'。 – herohuyongtao

+0

@herohuyongtao正確! +1給你。從int更改爲 – DhruvJoshi

+0

您錯過了一個開放式支架作爲回報(: –

0

factorial()定義應

int factorial(int n) 
{ 
if 
(n==0) return 1; 
else 
return n * factorial(n-1); 
} 

而在你main()功能,你應該這樣做:

for (i=1; i<=n; i++) sum = sum + 1.0/factorial(i); 
0

有一個單獨的函數計算階乘(N) 比加其餘的代碼,所以只有遞歸的東西纔會計算n!

1

您應該使用floatfactorial()的返回值(如果你使用int你只能得到01)和它的邏輯是不正確的。

您需要將其更改爲

float factorial(int n) 
{ 
    if (n==0) // or n==1 
     return 1; 
    else 
     return (1.0/n) * factorial(n-1); 
} 

完整的代碼示例可以在這裏看到:http://ideone.com/o2XGhE

+0

1/n不會工作,因爲您必須添加階乘數字而不僅僅是數字 – const

+0

@Karthik添加步驟是通過'sum = sum + factorial(i);',而不是在這個函數中。 – herohuyongtao

0

您可以使用此一:

int factorial(float n) 
{ 
    if (n==1) 
     return 1; 
    else 
     return (1/n) * factorial(n-1)); 
} 
+1

返回值應該是float而不是int。 – herohuyongtao

+0

謝謝herohuyongtao,那個小提示讓我的程序開始正常運行,謝謝! – Edward

0

優雅的解決方案是使用有條件的三元運算符:

float factorial(float n) { 
    return n ? ((1/n) * factorial(n-1)) : 1; 
}