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

Факториалы... - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
dimaki
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 12:59     Факториалы... #1
Приветствую. Если напишу, что нужна помощь в решении задачи - сурово вас обману. Помощь не нужна - нужно решение. Язык - Си, среда Dev-C++

Написать функцию для вычисления значения
Название: LySmkmlb.png
Просмотров: 71

Размер: 3.1 Кб

Вычислить с ее помощью значения S(n) для n от 12 до 24 с шагом 4

Добавлено через 21 час 8 минут
Благодаря NNN777 есть такой вариант, но ответ выврдится совсем невнятно

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
#include <iostream>
#include <cmath>
#include <conio.h>
 
long int factorial (long int numb);
 
using namespace std;
 
int main()
{
        int i;
        long int z, k;
        long double S;
        
        for (i=12; i<=24; i+=4)
        {
                z=factorial (2*i);
                k=factorial (24+i);
                S=double(z)/double(k);
                cout<<"S(n)= "<<S<<" "; 
        }
        cout<<endl;
        getch();
        return 0;
}
long int factorial (long int numb)
{
        if (numb<=1)
                return 1;
        else
                return numb * factorial(numb-1);
}
Факториалы...

 Комментарий модератора 
Прикрепляйте картинки к сообщениям.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2010, 12:59     Факториалы...
Посмотрите здесь:

C++ Марсианские факториалы:
Факториалы! C++
Pascal Факториалы !!
QBasic Факториалы
факториалы QBasic
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.12.2010, 13:09     Факториалы... #2
Цитата Сообщение от dimaki Посмотреть сообщение
Благодаря NNN777 есть такой вариант, но ответ выврдится совсем невнятно
А ты представляешь, к примеру, сколько цифр будет в числе (24 + 24)! ?
Да и вообще эта программа делает не то, что должна делать
dimaki
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 13:16  [ТС]     Факториалы... #3
крайне много
ну а я что могу поделать? - такое задание.
есть другие варианты? - с радостью взгляну
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
22.12.2010, 14:16     Факториалы... #4
-----
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.12.2010, 14:24     Факториалы... #5
Легко видеть, что http://www.cyberforum.ru/cgi-bin/latex.cgi?(\forall i \in [1, n]) \, 2 \cdot i \leq  n + n, значит, (n + i)! будет всегда делиться на (2i)! без остатка. Этим мы и воспользуемся.
Проверяй:
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
44
45
46
47
48
#include <stdio.h>
#include <stdlib.h>
 
typedef unsigned long long  ullong_t;
typedef long double     ldouble_t;
 
ullong_t product(size_t, size_t);
ldouble_t S(size_t);
void tabulate(size_t, size_t, size_t);
 
int main()
{
    tabulate(12, 24, 4);
    exit(0);
}
 
ullong_t product(size_t a, size_t b)
{
    ullong_t result = 1;
    while(a <= b)
        result *= a++;
        
    return result;
}
 
ldouble_t S(size_t n)
{
    if(!n)
    {
        fprintf(stderr, "n must be a positive non-zero number\n");
        exit(1);
    }
    size_t i = 1;
    ldouble_t sum = 0;
    while(i <= n)
    {
        sum += 1. / (ldouble_t) product(2 * i + 1, n + i);
        ++i;
    }
    
    return sum;
}
 
void tabulate(size_t a, size_t b, size_t step)
{
    for( ; a <= b; a += step)
        printf("S[%u] = %Lf\n", a, S(a));
}
Вроде переполнения не должно быть.

igorrr37, во-первых, ты неправильно понял задание, во-вторых, 48 факториал уж точно ни в какую переменную не влезет
dimaki
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 16:24  [ТС]     Факториалы... #6
Спасибо за помощь.
Код я не понял абсолютно, ибо нуб.
Ответ стал выводиться более понятно, но от этого не менее неправильно)

Название: FTY4WiD1.png
Просмотров: 89

Размер: 721 байт
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.12.2010, 16:27     Факториалы... #7
Цитата Сообщение от dimaki Посмотреть сообщение
Ответ стал выводиться более понятно, но от этого не менее неправильно)
Хе, а у меня - правильно:
Bash
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
nameless@nameless-desktop:~/foo$ cat main.c
#include <stdio.h>
#include <stdlib.h>
 
typedef unsigned long long      ullong_t;
typedef long double             ldouble_t;
 
ullong_t product(size_t, size_t);
ldouble_t S(size_t);
void tabulate(size_t, size_t, size_t);
 
int main()
{
        tabulate(12, 24, 4);
        exit(0);
}
 
ullong_t product(size_t a, size_t b)
{
        ullong_t result = 1;
        while(a <= b)
                result *= a++;
                
        return result;
}
 
ldouble_t S(size_t n)
{
        if(!n)
        {
                fprintf(stderr, "n must be a positive non-zero number\n");
                exit(1);
        }
        size_t i = 1;
        ldouble_t sum = 0;
        while(i <= n)
        {
                sum += 1. / (ldouble_t) product(2 * i + 1, n + i);
                ++i;
        }
        
        return sum;
}
 
void tabulate(size_t a, size_t b, size_t step)
{
        for( ; a <= b; a += step)
                printf("S[%u] = %Lf\n", a, S(a));
}
nameless@nameless-desktop:~/foo$ make && ./foo
cc    -c -o main.o main.c
cc main.o -o foo
S[12] = 1.045777
S[16] = 1.033455
S[20] = 1.026374
S[24] = 1.021772
nameless@nameless-desktop:~/foo$
dimaki
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 16:34  [ТС]     Факториалы... #8
кстати,
Цитата Сообщение от Nameless One Посмотреть сообщение
значит, (n + i)! будет всегда делиться на (2i)! без остатка
а разве не наоборот должно быть (2i)!/(n+i)! ???
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.12.2010, 16:36     Факториалы... #9
Цитата Сообщение от dimaki Посмотреть сообщение
а разве не наоборот должно быть (2i)!/(n+i)! ???
А оно так и есть. То, что я написал:
значит, (n + i)! будет всегда делиться на (2i)! без остатка
используется только для того, чтобы можно было сократить дробь
dimaki
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 16:40  [ТС]     Факториалы... #10
сразу извиняюсь, если туплю, но по-моему (2i)!<(n+i)!
а значит S(n)<1, разве нет?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.12.2010, 16:44     Факториалы... #11
По сути, исходная сумма:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i = 1}^{n} \frac{(2 \cdot i)!}{(n + i)!}
эквивалентна следующей:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i = 1}^{n} \frac{1}{(2 \cdot i + 1) \cdot (2 \cdot i + 2) \cdot ... \cdot (n + i - 1) \cdot (n + i) }

Цитата Сообщение от dimaki Посмотреть сообщение
сразу извиняюсь, если туплю, но по-моему (2i)!<(n+i)!
(2i)! не меньше (n + i)!, а меньше либо равно.
А именно, когда i = n, (2i)!=(n+i)!

Таким образом, хотя бы одно слагаемое суммы равно единице, поэтому http://www.cyberforum.ru/cgi-bin/latex.cgi?(\forall n \geq 1) \, S(n) \geq 1
dimaki
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 16:52  [ТС]     Факториалы... #12
Цитата Сообщение от Nameless One Посмотреть сообщение
(2i)! не меньше (n + i)!, а меньше либо равно.
да, точно.
Но тогда при n=i=24, s(n)=1, так?
А у Вас S[24] = 1.021772.
ну, не понимаю я)
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.12.2010, 16:59     Факториалы... #13
Цитата Сообщение от dimaki Посмотреть сообщение
да, точно.
Но тогда при n=i=24, s(n)=1, так?
Нет:
http://www.cyberforum.ru/cgi-bin/latex.cgi?S(24) \, = \, \sum_{i = 1}^{24} \frac{(2 \cdot i)!}{(24 + i)!} \, = \frac{(2 \cdot 1)!}{(24 + 1)!} + \frac{(2 \cdot 2)!}{(24 + 2)!} + \frac{(2 \cdot 3)!}{(24 + 3)!} +... + \frac{(2 \cdot 23)!}{(24 + 23)!} + \frac{(2 \cdot 24)!}{(24 + 24)!},
где последнее слагаемое как раз-таки будет равно единице, следоваетельно, сумма будет больше единицы.

А вот S(1) = 1
dimaki
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 17:04  [ТС]     Факториалы... #14
каюсь
Совсем забыл, что мы ищем сумму
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
22.12.2010, 18:51     Факториалы... #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
#include <iostream>
#include <cmath>
#include <conio.h>
#include<iomanip>
 
double factorial (double numb);
 
using namespace std;
 
int main()
{
        int i;
        double z, k;
        long double S=0;
        
        for (i=12; i<=24; i+=4)
        {
                z=factorial (2*i);
                k=factorial (24+i);
                S+=(double)z/k;
                cout<<"\nS(n)= "<<setprecision(20)<<S<<" "; 
        }
        cout<<endl;
        getch();
        return 0;
}
double factorial (double numb)
{
        if (numb<=1)
                return 1;
        else
                return numb * factorial(numb-1);
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.12.2010, 19:15     Факториалы... #16
igorrr37, при вычислении факториала таких больших чисел обязательно будет переполнение

К примеру, 48! будет равен (только что подсчитал) 12413915592536072670862289047373375038521486354677760000000000, что не влезет ни в один стандартный тип C/C++
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
22.12.2010, 20:28     Факториалы... #17
не знаю но у меня 48! пишет 1.24139*10^61 считает даже 170! равен 7.25742*10^306, а вот уже 171! пишет infinity может от компилятора зависит у меня double 8 байт занимает
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
22.12.2010, 21:42     Факториалы... #18
Я смотрю, мой друг Nameless One уже и здесь жжет не по детски!

Цитата Сообщение от Nameless One Посмотреть сообщение
S[12] = 1.045777
S[16] = 1.033455
S[20] = 1.026374
S[24] = 1.021772

Добре, добре... А вот как я достиг того же результата:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
  double sn, sni;
  int n, i, j;
 
  for (n=12; n<=24; n+=4) {
    for (sn=0.0, i=1; i<=n; i++) {
      for (sni=1, j=2*i+1; j<=n+i; j++) 
        sni/=j;
      sn+=sni;
    }
    printf("S[%2d]=%.6f\n", n, sn);
  }
    
  system("pause");
    
  return(0);
}


Добавлено через 3 минуты
Nameless One, опять будешь утверждать, что твой код эффективнее и понятнее?
Nameless One
23.12.2010, 03:23
  #19

Не по теме:

Цитата Сообщение от Напильнег Посмотреть сообщение
Nameless One, опять будешь утверждать, что твой код эффективнее и понятнее?
Насчет эффективнее - нет. А вот насчет понятнее, то да, так как все ключевые операции выделены в соответсвующие функции с "говорящими" именами.
Кстати, продолжая нашу дискуссию из темы про рекурсию и пользуясь твоими доводами, я могу сказать, что твое решение неправильное и в качестве объяснения отослать перечитывать постановку задачи.

"Спасибо мне, за то, что я тут есть!" ©

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2010, 08:54     Факториалы...
Еще ссылки по теме:

C++ Факториалы
C++ Большие факториалы
C++ Обьясните, почему код так странно считает факториалы

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

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
23.12.2010, 08:54     Факториалы... #20
Напильнег, зачем новое слагаемое искать так сложно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
  double sn, sni;
  int n, i, j;
 
  for (n=12; n<=24; n+=4) {
    for ( sni=1./(2*n-1), sn=1.+1./(2*n-1), i=2*n-1; i>n+1; i--) {
        sni*=i;
      for (j=2*i-2*n-1; j<=2*i-2*n; j++) 
         sni/=j;
      sn+=sni;
    }
    printf("S[%2d]=%.6f\n", n, sn);
  }
    
  system("pause");
    
  return(0);
}
"и никаких сусликов".
Yandex
Объявления
23.12.2010, 08:54     Факториалы...
Ответ Создать тему
Опции темы

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