2015-07-28 2 views
4

Я написал программу C для вычисления количества способов выбора k объектов из n различных объектов с использованием функций.Программа C вычисляет количество способов выбора k объектов из n отдельных объектов. 'k' и 'n' оба являются целыми числами

#include<stdio.h> 
    long f(int a) 
    { 
    if(a==1||a==0)return(0); 
    else return(a*f(a-1)); 
    } 

    int combination(int N,int K) 
    { 
    long int NF,KF,NMKF; 
    NF=f(N); 
    KF=f(K); 
    NMKF=f(N-K); 
    return(NF/(KF*NMKF)); 

    } 
    int main() 
    { 
    int n,k; 
    scanf("%d%d",&n,&k); 
    combination(n,k); 
    } 

Но компилятор показывает следующее сообщение об ошибке

floating point exception (core dumped) 

Как избежать этого?

+1

Расчет биномиальных коэффициентов из факториалов - очень плохая идея. – EOF

+1

Ошибка выглядит как арифметическая ошибка (деление на ноль, по модулю на ноль и т. Д.) – Vultrao

+1

Вы могли бы узнать это самостоятельно. Вы должны научиться использовать отладчик. –

ответ

12

Проблема заключается в этой строке

if(a==1||a==0)return(0); 

Он должен быть

if(a==1||a==0)return(1); 

При расчете факториала, n*(n-1)*(n-2)...*(2)*(1). Обратите внимание, в конце мы умножаем на 1, а не на ноль. умноженное на 0, сделает факториал 0. И позже, когда вы выполняете деление, 0 входит в знаменатель, и происходит floating point exception. Вот почему ваша программа дает ошибку.

Для случаев, когда факториал 0 не требуется. Тогда это также сработает, потому что факториал 0 равен 1 и не0 .. Проверьте this.

3

Две проблемы:

  1. if(a==1||a==0) вы должны return 1, не return 0. Потому что 1!=1, 0!=1.
  2. Ваше намерение: choose k objects from n distinct objects. Но вы должны добавить проверку параметров, чтобы не возникнуть n<k. Если мы введем n=2, k=3. Программа пойдет на ошибку. Это плохо! Надеюсь, это может вам помочь.
+0

Хорошо, второй пункт не был объяснен в самом высоком ответе, +1. –

 Смежные вопросы

  • Нет связанных вопросов^_^