2015-07-01 35 views
0

我正在嘗試查找nCr值。沒有錯誤,但我得到1作爲所有輸入的答案。請幫助我找到解決方案。查找nCr值

#include <stdio.h> 

int fact(int num) 
{ 
    int f=1,i; 
    for(i=1;i<=num;i++) 
    { 
     f=f*1; 
    } 
    return f; 
} 

int main(void) 
{ 
    int n,r,ncr=0; 
    printf("\n enter n and r values"); 
    scanf("%d%d",&n,&r); 
    ncr=(fact(n)/(fact(r) * fact(n-r))); 
    printf("\n ncr for %d and %d is %d",n,r,ncr); 
    return 0; 
} 
+2

請記住,一個32位的'int'只能處理階乘高達'12!',和64 'int'只能達到'20!' – user3386109

回答

2

您的因子代碼不正確。

你設置了f = 1,然後做了一堆次f = f * 1。然後返回f,這仍然是1。我想你的意思是f = f*i對不對?

int fact(int num) 
{ 
    int f=1,i; 
    for(i=1;i<=num;i++) 
    { 
     f=f*i; 
    } 
    return f; 
} 
3

它不應該是f = F * 1,而F = F *我

0

你的方法來計算階乘需要修正。應該是:

int fact(int num) 

{ 

    int f=1,i; 
    for(i=1;i<=num;i++) 
    { 
     f=f*i; 
    } 
    return f; 
} 

此外,如果r> n,則nCr未定義。您應該在您的scanf呼叫之後添加此檢查。

類似於: if (r > n) printf("r cannot be greater than n.")

計算階乘的更標準形式是使用遞歸的形式。

int fact(int num) 

{ 


    if (num == 1 || num == 0) 

    return 1; 

    else 

    return (num * fact(num - 1)); 
} 
0

更好,更快的方法是計算nCr的這樣

int nCr(int n, int r) { 
    if (r > n/2) r = n - r; 
    int ans = 1, i; 
    for (i = 1; i <= r; i++) { 
     ans *= n - r + i; 
     ans /= i; 
    } 
    return ans; 
}