2014-11-08 93 views
-2

計算階乘的C++

我寫了這個代碼:
如何通過函數計算階乘的C++

int fact (int A) 
{ 
int B ; 
B= A*(A-1); 
return B; 
} 


int main() 
{ 
    int x; 
    cout <<"Enter number to calulate its factorial :"<<endl; 
     cin >> x ; 
     cout << fac (x); 

} 
+1

你的'事實(10)'結果爲'10 * 9',就是這樣。使用遞歸或循環來完成這項工作。 – 2014-11-08 07:43:04

回答

0

你有沒有試過google一下在發佈之前?

​​
0

您的事實函數只計算一次的階乘。你應該做的事情resursively喜歡:

int fact (int A) 
{ 
    if (A <= 1) { 
     return 1; 
    } 
    return A*fact(A-1); 
} 

,或者如果你想在迭代的方式,那麼你應該做到以下幾點:

int fact (int A) 
{ 
    int B = 1, i = 2; 
    for (; i<=A; i++) { 
     B = B*i; 
    } 
    return B; 
} 
+0

我可能會將範圍限制爲無符號整數,因爲標準因子僅限於非負數。 – Mario 2014-11-08 08:01:17

+0

@Mario我會同意你100%..我只是試圖糾正OP的代碼,所以他有一些基本的理解它是如何工作的。 – SMA 2014-11-08 08:23:11

0

爲什麼din't你搜索它來代替。

反正...這一切

int n, count; 
    unsigned long long int factorial=1;   
    cout<<"Enter an integer: "; 
    cin>>n; 
    if (n< 0) 
     printf("Error!!! Factorial of negative number doesn't exist."); 
    else 
    { 
     for(count=1;count<=n;++count) /* for loop terminates if count>n */ 
     { 
      factorial*=count;    /* factorial=factorial*count */ 
     } 
    cout<<factorial; 
    } 
0

首先無關++做與C(你的問題說的)。這是特定於算法的,它們可以用於任何語言。

您可以使用下面的示例作爲參考。

int fact (int A) 
{ 
    if (A == 0) { 
     return 1; 
    } 
    return A*fact(A-1); 
} 
0
int factorial (int a) { 
    return a==0 ? 1 : a*factorial(a-1); 
} 
-1

由於您使用C++而不是C,我會簡單地用一個模板函數去。獎金是:因膨脹/在編譯時執行,你的代碼將被高度優化且基本上是固定的可能幾乎沒有開銷:

// First the generic template for pretty much all numbers 
template <unsigned int X> 
unsigned int factorial() { 
    return X * factorial<X - 1>(); 
} 

// Now the specialization for the special case of 0 
template <> 
unsigned int factorial<0>() { 
    return 1; 
} 

例如,計算5的階乘,你」 d只需撥打factorial<5>()即可。啓用優化後,這隻會導致120。不幸的是,這對動態變量是不可能的。

+0

我不確定它是有用的還是合適的,因爲優化編譯器能夠在遞歸(或迭代)事實函數通過常量摺疊和內聯變換常量時變換常量。 – 2014-11-08 08:08:02

+0

@BasileStarynkevitch是的,它可能只是取決於優化的水平。無論您是否使用模板,最多都可能沒有任何區別。 – Mario 2014-11-08 08:10:39

+0

不,至少在GCC優化不取決於您是否使用模板(因爲模板擴展發生在優化之前)。所以我低估了你的答案。 – 2014-11-08 08:12:47