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

факториал - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
ulx05
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 139
01.09.2012, 19:21     факториал #1
сумма факториалов
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 19:21     факториал
Посмотрите здесь:

C++ факториал
C++ Факториал (n-1)!
факториал в с++ C++
C++ Факториал
C++ Факториал Си
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
01.09.2012, 19:22     факториал #2
Цитата Сообщение от ulx05 Посмотреть сообщение
факториал
сумма факториалов
и что дальше? подробнее опиши
ulx05
0 / 0 / 0
Регистрация: 17.07.2012
Сообщений: 139
01.09.2012, 19:23  [ТС]     факториал #3
вычислить сумму : 1+1/1!+1/2!+1/3!+...+1/n!. значение n вводится с клавиатуры: 1<n>=10
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
01.09.2012, 19:28     факториал #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
int fact (int n)
{
    if (n == 0 || n == 1)
        return 1;
    return fact(n-1) * n;
}
 
int main()
{
    double result = 1;
    int n;
    std:: cin >> n;
 
    for (int i=0; i<n; ++i)
        result += 1.0/fact(i);
    
    std:: cout << std::fixed << result << std::endl;
    system ("pause");
    return 0;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.09.2012, 12:33     факториал #5
находим множитель рекурентного соотношения
Код
1 / n!  :  1 / (n - 1)!

(n - 1)! / n!

(n - 1)! / ((n - 1)! * n) = 1 / n


C++
1
2
3
4
5
6
7
8
  double sum;
  int n, i;
   
  n = 1000;
  
  sum = 1;
  for (i = 2; i <= n; i++)
      sum /= i;
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
02.09.2012, 12:39     факториал #6
accept, находим множитель рекурентного соотношения. Не могли бы вы подробнее про это рассказать?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.09.2012, 12:42     факториал #7
берётся формула n-ого члена и делится на формулу (n-1)-го члена
что получилось - то является множителем, на который нужно домножать член последовательности, чтобы получить следующий за ним член

а вообще, этот ряд даёт число e
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
02.09.2012, 12:48     факториал #8
accept, ответ не сходится - мой код ваш код
(в моем коде правка есть - не for (int i=0; i<n; ++i), а for (int i=1; i<=n; ++i)
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.09.2012, 12:58     факториал #9
Цитата Сообщение от Dani Посмотреть сообщение
ответ не сходится - мой код ваш код
(в моем коде правка есть - не for (int i=0; i<n; ++i), а for (int i=1; i<=n; ++i)
у тебя ошибка, все сходится
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
02.09.2012, 13:02     факториал #10
Jupiter, 2.71828 и 2.75573
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.09.2012, 13:27     факториал #11
Цитата Сообщение от Jupiter Посмотреть сообщение
у тебя ошибка, все сходится
не совсем, правильнее будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int main()
{
   double sum = 1.0, first = 1.0;
   int n = 2;
   
   for (int i = 1; i <= n; i++)
   {
       first /= i;
       sum += first;      
   }
      
   std::cout << sum;
   return 0;
 }
Jupiter
02.09.2012, 13:37
  #12

Не по теме:

valeriikozlov, чем правильнее?

valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.09.2012, 13:43     факториал #13
Цитата Сообщение от Jupiter Посмотреть сообщение
Не по теме:
valeriikozlov, чем правильнее?
при условии задачи:
Цитата Сообщение от ulx05 Посмотреть сообщение
вычислить сумму : 1+1/1!+1/2!+1/3!+...+1/n!. значение n вводится с клавиатуры: 1<n>=10
при n==2 должно выдать 2.5 (вручную можно посчитать)
код, на который Вы ссылаетесь: http://liveworkspace.org/code/a97250...e96097f64f1a22
выдает: 2
Catstail
Модератор
 Аватар для Catstail
21503 / 10256 / 1670
Регистрация: 12.02.2012
Сообщений: 17,143
02.09.2012, 15:49     факториал #14
Цитата Сообщение от ulx05 Посмотреть сообщение
1+1/1!+1/2!+1/3!+...+1/n!.
- а проще всего не парится, а сразу написать:

C++
1
cout << exp(1) << endl;
эта сумма равна числу e c приличной точностью.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.09.2012, 18:17     факториал #15
В компайл тайм:
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 < 1, 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()
{
   constexpr int n = 10;
    
   typedef typename Sum< n >::value result_ratio;
    
    constexpr std::uint64_t num = result_ratio::num;
    constexpr std::uint64_t den = result_ratio::den;
    std::cout << static_cast< double > (num) / den + 1 << std::endl;
}
Результат: http://liveworkspace.org/code/020ff9...d2ac46a8d75511
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
02.09.2012, 19:30     факториал #16
Цитата Сообщение от accept Посмотреть сообщение
берётся формула n-ого члена и делится на формулу (n-1)-го члена
что получилось - то является множителем, на который нужно домножать член последовательности, чтобы получить следующий за ним член
вообще то ты описал геометрическую прогрессию
здесь не канает
смотри
1/1! 1/2! разница в 1/2
1/2! 1/3! разница в 1/3
1/3! 1/4! разница в 1/4
т.е каждый раз множитель разный

Добавлено через 4 минуты
Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
3
sum = 1;
 for (i = 2; i <= n; i++)
 sum /= i;
а где здесь сумма???
можно без цикла написать
sum /= n;

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
а вообще, этот ряд даёт число e
а здесь согласен
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.09.2012, 01:11     факториал #17
Цитата Сообщение от ValeryS Посмотреть сообщение
вообще то ты описал геометрическую прогрессию
это я забыл сложить их

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main()
{
    double sum, yi;
    int n, i;
   
    n = 1000;
  
    sum = yi = 1;
    for (i = 1; i <= n; i++) {
        yi /= i;
        sum += yi;
    }
    
    cout << sum << endl;
    
    return 0;
}
Код
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ ./t
2.71828
[guest@localhost tests]$
Добавлено через 3 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
- а проще всего не парится, а сразу написать:
не, это понятно, просто рядов есть множество
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.09.2012, 15:25     факториал #18
Для интереса приведу такую формулу:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{k=0}^n\frac{1}{k!} =\frac{|n!\cdot e|}{n!}, где | | - целая часть числа (скобки [] почему-то в формулах не отображаются).
В программировании она почти не применима, так как число e трансцендентно, но теоретически интересна.
Catstail
Модератор
 Аватар для Catstail
21503 / 10256 / 1670
Регистрация: 12.02.2012
Сообщений: 17,143
03.09.2012, 17:40     факториал #19
Цитата Сообщение от Thinker Посмотреть сообщение
трансцендентно
- если быть более точным, потому, что e - иррационально (т.е. непериодическая бесконечная дробь). А то, что e трансцендентно, не играет роли.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2012, 20:09     факториал
Еще ссылки по теме:

C++ Факториал
факториал С++ C++
Факториал C++

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.09.2012, 20:09     факториал #20
Цитата Сообщение от Catstail Посмотреть сообщение
e - иррационально... А то, что e трансцендентно, не играет роли.
Вы просто забыли утверждение: каждое трансцендентное вещественное число является иррациональным, которое легко доказывается. А вот обратное неверно, например число http://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{2} иррационально, но не трансцендентно. Так что число e обладает более сильным свойством, нежели просто иррациональность.

Вообще трасцендентных чисел бесконечно много, но поиск их крайне проблематичен. А с иррациональными числами гораздо проще. Интересна в этом плане теория Галуа, где понятие трансцендентности вводится исходя из расширений полей. В частности, это еще один метод доказательства алгебраической замкнутости поля комплексных чисел.

Так что с трансцендентностью и алгебраичностью не стоит так небрежно. Теория Галуа описывает все конечные поля с точностью до изоморфизма, которые крайне важны для шифров с открытыми ключами, особенно для шифров на эллиптических кривых. А не было бы эллиптических кривых, то пришлось бы использовать кольца вычетов по очень большим модулям, что снижало бы очень их производительность.
Yandex
Объявления
03.09.2012, 20:09     факториал
Ответ Создать тему
Опции темы

Текущее время: 03:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru