2014-02-10 3 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; 
} 

У меня есть небольшое представление о том, что я делаю, я действительно новичок в этом. Мой мыслительный процесс состоял в том, чтобы настроить функцию хрустания числа (мой жаргон, вероятно, выключен), а затем инициировать основную функцию. Я думал, что правильно настроен, но через пару часов я чувствую себя просто потерянным. Любая помощь и руководство будут высоко оценены.

Update

Вот обновленный код:

#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» не дает результата «1», так как 0! = 1. Должен ли я перемещать этот оператор if внутри «int main()»?

+0

Я думаю, что вы получили это неправильно .... запустить его с небольшим количеством и отладки и посмотреть ... – Dani

+0

Один небольшой комментарий. Факториал большого числа приведет к ошибкам переполнения. Лучше найти 1.0/factorial (n) правильно, используя цикл 'for'. Что-то вроде '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 до double – 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!

1

Вы должны использовать float в качестве возвращаемого значения factorial() (вы можете получить только 0 или 1, если вы используете int) и его логика не является правильным.

Вы должны изменить его

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; 
} 
Смежные вопросы