Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
forumchanin2012
Сообщений: n/a
#1

Задача с факториалом - C++

12.05.2012, 01:35. Просмотров 1516. Ответов 11
Метки нет (Все метки)

Помогите решить задачу на с++. Нужно вывести сумму дробей х/х! при х от 1 до 20. То есть 1/1! + 2/2! + 3/3! и так далее до 20. Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 01:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача с факториалом (C++):

Приимер с факториалом на с++ - C++
Вообщем нужно дописать код,дано задание:Дано n,вычислить 1/0!+1/1!+...+1/n! Для определённого числа могу написать(1,2,5,10 и т.д)А чтобы...

Уравнение с факториалом C++ - C++
Здравствуйте, не могу понять что не так. #include <iostream> #include <cmath> using namespace std; int main() { ...

Выражение с факториалом и суммой - C++
x вводишь сам.Спасибо большое заранее \varphi =\frac{\cos (x+5)}{3!+\sum_{3}^{8}{e}^{0.2i}}

Вычисление суммы с факториалом - C++
Для каждого x, изменяющегося от a до b с шагом h, найти значения функции Y(x), суммы S(x) и |Y(x)–S(x)| и вывести в виде таблицы. Значения...

Вычисление суммы ряда с факториалом - C++
не могу понять как правильно сделать, чтобы вычислялся факториал \sum_{0}^{\infty}\frac{1}{(2n + 1)!} #include <iostream> #define...

Сумма бесконечного ряда с факториалом - C++
Найти сумму ряда с заданной точностью e = 0,001, общий член которого: a = n! / pow(n,n) Проблема в том, что вычислить надо не с помощью...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
12.05.2012, 01:44 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <cstdlib>
#include <iostream.h>
double fact(int n)
{if(n!=0)
    return n*fact(n-1);
    return 1;
    }
 
 
int main()
{float res=0;
    for(int i=1;i<21;i++)
    {
    res+=(float)i/fact(i);    
    }
    cout<<res<<endl;
    system("PAUSE");
    return 0;
}
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,585
Записей в блоге: 17
12.05.2012, 02:04 #3
ser4ega, неэффективно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
double fn=1,sum=0;
int n;
cout<<"Введите кол-во слагаемых: "; cin>>n;
cout<<"Расчет: "<<endl;
for(int i=1;i<=n;i++)
    {
    fn*=i;
    sum+= i/fn;
    cout<<"+"<<i<<"/"<<fn<<endl;
    }
 
cout<<"Результат: "<<sum<<endl;
 
system("pause");
return 0;
}
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
12.05.2012, 02:23 #4
Avazart, неэффективно =D

C++
1
2
3
4
5
6
7
#include <iostream.h>
int main()
{
cout<<"2.71828\n";
system("pause");
return 0;
}
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 11:18 #5
Avazart, неэффективно.
ser4ega, нечестно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <ratio>
#include <cstdint>
 
template < int i >
struct Factorial
{
    static const std::uint64_t value = i * Factorial< i - 1 >::value;
};
 
template <>
struct Factorial< 1 >
{
    static const int value = 1;
};
 
template < int i >
class Sum
{
private:
    typedef std::ratio < i, Factorial< i >::value > current;
 
public: 
    typedef std::ratio_add< current, typename Sum< i - 1 >::value > value;
};
 
template <>
class Sum< 1 >
{
public:
    typedef std::ratio< 1, 1 > value;
};
 
int main()
{
    typedef typename Sum< 20 >::value result_ratio;
    
    constexpr std::uint64_t num = result_ratio::num;
    constexpr std::uint64_t den = result_ratio::den;
    
    std::cout << num << "/" << den << std::endl;
    std::cout << "(" << static_cast< double > (num) / den << ")" << std::endl;
}
Результат: http://liveworkspace.org/code/d6a40f...c405af5ca562f6
;)
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,585
Записей в блоге: 17
12.05.2012, 15:17 #6
Avazart, неэффективно.
diagon т.е не стоит желить при каждой итерации лучше накапливать?
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 15:26 #7
Цитата Сообщение от Avazart Посмотреть сообщение
diagon т.е не стоит желить при каждой итерации лучше накапливать
А тогда потеряется точность(хотя не факт).
Ну вообще я имел в виду, что вы вычисляете в рантайме, в то время как мой код во время компиляции, причем дробные числа используются только для вывода ответа.
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,585
Записей в блоге: 17
12.05.2012, 15:37 #8
Т.е в этой сторке уже идет частичный расчет на основе предыдущего класса?

C++
1
2
3
4
5
template <>
struct Factorial< 1 >
{
    static const int value = 1;
};
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
12.05.2012, 15:37 #9
На Си как-то так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
long fact(int n)
{
        static int res = 1;
        return (res *= n);
}
 
int main(void)
{
        float Result = 1.0;
        for ( int  i = 2 ; i <= 20 ; ++i )
                Result += (float) i / fact(i);
        printf("%f\n", Result);
}
http://ideone.com/XXfZd
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 15:46 #10
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е в этой сторке уже идет частичный расчет на основе предыдущего класса?
Получается рекурсия - Factorial< i > использует значение Factorial< i - 1 >.
Т.е. получается compile-time аналог следующей функции
C++
1
2
3
4
int Factorial(int i)
{
    return i * Factorial(i - 1);
}
Но такая рекурсия будет бесконечной.
Если в обычной рекурсивной функции можно поставить условие выхода из рекурсии, вроде такого
C++
1
2
3
4
5
6
7
int Factorial(int i)
{
    if ( i == 1 )
        return 1;
    
    return i * Factorial(i - 1);
}
То в шаблонах такого сделать не получиться, вместо этого можно использовать специализацию, которую вы и процитировали.
P.S. а задача хорошая, хоть опробовал <ratio> в деле. А то я про этот хедер почитал в референсе, но так и не придумал задачу, в которой можно его использовать >_<''
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,585
Записей в блоге: 17
12.05.2012, 16:11 #11
Так благодоря чему расчет производится на этапе компиляции?

За счет создания экземпляра шаблона Sum< 20 > на этапе компиляции?
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.05.2012, 16:31 #12
Цитата Сообщение от Avazart Посмотреть сообщение
За счет создания экземпляра шаблона Sum< 20 > на этапе компиляции?
Ну и поэтому тоже.
А вообще за счет того, что шаблоны обязаны вычисляться на этапе компиляции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2012, 16:31
Привет! Вот еще темы с ответами:

Запись формулы алгебраической суммы c факториалом - C++
не могу понять как записать и посчитать это выражение: \sum_{K=1}^{N} \frac{K!}{\frac{1}{2}+\frac{1}{3}+...+\frac{1}{K+1}}

Найти значение функции и суммы с факториалом - C++
Имеется задание: Для каждого x, изменяющегося от a до b с шагом h, найти значения функции Y(x), суммы S(x) и |Y(x)–S(x)| и вывести в виде...

Инициализировать каждый элемент факториалом от его номера i - C++
Помогите написать программу для решения следующей задачи: Имеется массив чисел. Инициализировать каждый элемент факториалом от его...

Задача с факториалом - Pascal ABC
Здравствуте, возможно эта тема была и я ее не увидела, подскажите пожалуйста как выполнить данную задачу: Для заданного х составить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.05.2012, 16:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru