2015-07-01 2 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 -bit '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 * я

0

Ваш метод для вычисления факториала нуждается в коррекции. Должно быть:

int fact(int num) 

{ 

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

Кроме того, nCr не определяется, если r> n. Вы должны добавить эту проверку после вызова 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; 
} 
Смежные вопросы