Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17

Факториалы...

22.12.2010, 12:59. Показов 3209. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Если напишу, что нужна помощь в решении задачи - сурово вас обману. Помощь не нужна - нужно решение. Язык - Си, среда Dev-C++

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

Размер: 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);
}


 Комментарий модератора 
Прикрепляйте картинки к сообщениям.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.12.2010, 12:59
Ответы с готовыми решениями:

Факториалы
Добрый день , не могу понять почему не работает программа . Вроде все сделал корректно , и результат показывает , только значения Y(x) и...

Факториалы
http://acm.timus.ru/problem.aspx?space=1&amp;num=1083 помогите решить эту задачу у меня мысль есть, но похоже неправильная. ...

Факториалы!
В лабе нужно вычислить выражение, в котором находятся числа с факториалами в таком порядке: 1!+2!+...+К!, я не знаю как это описать в...

28
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 13:09
Цитата Сообщение от dimaki Посмотреть сообщение
Благодаря NNN777 есть такой вариант, но ответ выврдится совсем невнятно
А ты представляешь, к примеру, сколько цифр будет в числе (24 + 24)! ?
Да и вообще эта программа делает не то, что должна делать
0
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 13:16  [ТС]
крайне много
ну а я что могу поделать? - такое задание.
есть другие варианты? - с радостью взгляну
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,750
Записей в блоге: 10
22.12.2010, 14:16
-----
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 14:24
Легко видеть, что https://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 факториал уж точно ни в какую переменную не влезет
1
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 16:24  [ТС]
Спасибо за помощь.
Код я не понял абсолютно, ибо нуб.
Ответ стал выводиться более понятно, но от этого не менее неправильно)

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

Размер: 721 байт
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 16:27
Цитата Сообщение от 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$
0
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 16:34  [ТС]
кстати,
Цитата Сообщение от Nameless One Посмотреть сообщение
значит, (n + i)! будет всегда делиться на (2i)! без остатка
а разве не наоборот должно быть (2i)!/(n+i)! ???
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 16:36
Цитата Сообщение от dimaki Посмотреть сообщение
а разве не наоборот должно быть (2i)!/(n+i)! ???
А оно так и есть. То, что я написал:
значит, (n + i)! будет всегда делиться на (2i)! без остатка
используется только для того, чтобы можно было сократить дробь
0
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 16:40  [ТС]
сразу извиняюсь, если туплю, но по-моему (2i)!<(n+i)!
а значит S(n)<1, разве нет?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 16:44
По сути, исходная сумма:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i = 1}^{n} \frac{(2 \cdot i)!}{(n + i)!}
эквивалентна следующей:
https://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)!

Таким образом, хотя бы одно слагаемое суммы равно единице, поэтому https://www.cyberforum.ru/cgi-bin/latex.cgi?(\forall n \geq 1) \, S(n) \geq 1
0
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 16:52  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение
(2i)! не меньше (n + i)!, а меньше либо равно.
да, точно.
Но тогда при n=i=24, s(n)=1, так?
А у Вас S[24] = 1.021772.
ну, не понимаю я)
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 16:59
Цитата Сообщение от dimaki Посмотреть сообщение
да, точно.
Но тогда при n=i=24, s(n)=1, так?
Нет:
https://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
0
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
22.12.2010, 17:04  [ТС]
каюсь
Совсем забыл, что мы ищем сумму
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,750
Записей в блоге: 10
22.12.2010, 18:51
вот на плюсах если интересно
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);
}
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 19:15
igorrr37, при вычислении факториала таких больших чисел обязательно будет переполнение

К примеру, 48! будет равен (только что подсчитал) 1241391559253607267086228904737337503852 1486354677760000000000, что не влезет ни в один стандартный тип C/C++
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,750
Записей в блоге: 10
22.12.2010, 20:28
не знаю но у меня 48! пишет 1.24139*10^61 считает даже 170! равен 7.25742*10^306, а вот уже 171! пишет infinity может от компилятора зависит у меня double 8 байт занимает
0
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
22.12.2010, 21:42
Я смотрю, мой друг 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, опять будешь утверждать, что твой код эффективнее и понятнее?
1
23.12.2010, 03:23

Не по теме:

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

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

0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
23.12.2010, 08:54
Напильнег, зачем новое слагаемое искать так сложно?
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);
}
"и никаких сусликов".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2010, 08:54
Помогаю со студенческими работами здесь

Факториалы числа
Дано число N. Рассчитать и вывести первые N факториалов. (1!, 2! ... N!) Задача-то лёгкая, но есть одна загвоздка: переменная цикла и...

Большие факториалы
Помогите написать программу,котороя щитает большые фактуриалы(100!,200! и тд)

Рекурсия: вывести факториалы от 1 до 10
Нужно рекурсивно вывести все факториалы от 1-го до 10

Вычисление по формуле. Факториалы
Не знаю как это решить, помогите плиз Напишите программу вычисления примера y = a! + b! / a! - b! с помощью функции расчета х! = 1 *...

пожалуйста факториалы. Заранее спасибо)
1+x^2/2!+x^4/4!+...+x^2n/2n!+...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru