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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
dimaki
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 17
#1

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

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

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

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

Размер: 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++
http://acm.timus.ru/problem.aspx?space=1&amp;num=1083 помогите решить эту задачу у меня мысль есть, но похоже неправильная. ...

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

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

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

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

Обьясните, почему код так странно считает факториалы - C++
Добрый день, ув. форумчане. Есть код, считающий факториалы:#include &quot;stdio.h&quot; #include &quot;windows.h&quot; __int64 factorial(__int64 n) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
22.12.2010, 19:15 #16
igorrr37, при вычислении факториала таких больших чисел обязательно будет переполнение

К примеру, 48! будет равен (только что подсчитал) 12413915592536072670862289047373375038521486354677760000000000, что не влезет ни в один стандартный тип C/C++
igorrr37
1646 / 1274 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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, опять будешь утверждать, что твой код эффективнее и понятнее?
Насчет эффективнее - нет. А вот насчет понятнее, то да, так как все ключевые операции выделены в соответсвующие функции с "говорящими" именами.
Кстати, продолжая нашу дискуссию из темы про рекурсию и пользуясь твоими доводами, я могу сказать, что твое решение неправильное и в качестве объяснения отослать перечитывать постановку задачи.

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

valeriikozlov
Эксперт C++
4670 / 2496 / 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);
}
"и никаких сусликов".
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
24.12.2010, 22:31 #21
Я смотрю, меня здесь уже цитируют вовсю. Ну да ладно...

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

Я воспользовался очевиднейшим соотношением

(2i)!/(n+i)! = 1/(2i+1)/(2i+2)/.../(n+i-1)/(n+i)

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

Цитата Сообщение от Nameless One Посмотреть сообщение
Кстати, продолжая нашу дискуссию из темы про рекурсию и пользуясь твоими доводами, я могу сказать, что твое решение неправильное и в качестве объяснения отослать перечитывать постановку задачи.
Попал пальцем в небо - там требовалось написать самодостаточную функцию, которая <бла-бла-бла...>, грубо говоря с жестко заданным интерфейсом, и решения, требующие для себя другого интерфейса, нельзя было считать правильными. Тут затыка в алгоритме вычислений, я его сделал в простейшей обертке, только чтоб суть алгоритма вычислений показать - я вообще не ставлю перед собой задачи сделать шкубенту задачу по ключ. У тебя же бредовейший алгоритм, само направление мысли какое-то не в ту сторону, как его не оборачивай.
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
24.12.2010, 23:11 #22
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Напильнег, зачем новое слагаемое искать так сложно?
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);
}
"и никаких сусликов".
Если ЭТО называется "просто", то мы наверное русский язык в сильно разных бурсах учили О_о

Вот тебе реальне простое "хвостовое" решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
  double sn, sni;
  int n, i;
 
  for (n=12; n<=24; n+=4) {
    for ( sni=1.0, sn=1.0, i=n-1; i>=1; i--) {
      sni=sni/(2*i+1)/(2*i+2)*(n+i+1);
      sn+=sni;
    }
    printf("S[%2d]=%.6f\n", n, sn);
  }
    
  system("pause");
    
  return(0);
}
- как видно, тут внутреннего цикла вообще нет, Sni вычисляются по рекурентным образом.

Но на самом деле в данном случае так (с хвоста) делать не надо. Вот эффективное и со всех сторон корректное решение:
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 (sni=1, j=3; j<=n+1; j++) sni/=j;
    for (sn=sni, i=2; i<=n; i++) {
      sni=sni*(2*i-1)*(2*i)/(n+i);
      sn+=sni;
    }
    printf("S[%2d]=%.6f\n", n, sn);
  }
    
  system("pause");
    
  return(0);
}
Изображения
 
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2010, 07:25 #23
Цитата Сообщение от Напильнег Посмотреть сообщение
Если ЭТО называется "просто", то мы наверное русский язык в сильно разных бурсах учили
Наверное все-таки просто, раз следующие Ваши два кода теперь вычисляют очередное слагаемое не путем деления 1 на кучу делителей, а путем 2 умножений и одним делением (или путем 2 делений и 1 умножением) предыдущего слагаемого.
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
25.12.2010, 11:54 #24
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Наверное все-таки просто, раз следующие Ваши два кода теперь вычисляют очередное слагаемое не путем деления 1 на кучу делителей, а путем 2 умножений и одним делением (или путем 2 делений и 1 умножением) предыдущего слагаемого.
Я таким образом убиваю внутренний цикл и избегаю повторных вычислений, а ты что добился усложнением выражений и рассогласованием индексации цикла и нумерации слагаемых? Цикл на месте, выражения стали - "без стакана не разберешься"...

Ладно, ты хоть понял, почему з хвоста считать нежелательно? (конституцией РФ не запрещено, но таки нежелательно)
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.12.2010, 12:14 #25
Цитата Сообщение от Напильнег Посмотреть сообщение
Я таким образом убиваю внутренний цикл и избегаю повторных вычислений
Правильнее будет так:
Я понял, благодаря Вам, что находить каждое слагаемое путем деления 1 на кучу делителей, менее эффективно, чем находить очередное слагаемое из значения соседнего слагаемого.
Цитата Сообщение от Напильнег Посмотреть сообщение
почему з хвоста считать нежелательно?

Цитата Сообщение от Напильнег Посмотреть сообщение
for (sni=1, j=3; j<=n+1; j++) sni/=j;// конечно "з хвоста" нежелательно. Кол-во операций деления в целом ведь не увеличивается (именно за счет этой строки).
for (sn=sni, i=2; i<=n; i++) {
sni=sni*(2*i-1)*(2*i)/(n+i);
sn+=sni;
Жалко нет зевающего смайлика. В общем придумаете, какой-нибудь более простой алгоритм (а не вариацию моего) - тогда отвечу. А так спор заканчиваю, скучно.
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
25.12.2010, 15:18 #26
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Правильнее будет так:
Я понял, благодаря Вам, что находить каждое слагаемое путем деления 1 на кучу делителей, менее эффективно, чем находить очередное слагаемое из значения соседнего слагаемого.
А-а-а! Дошло наконец - Ваше
C++
1
for (j=2*i-2*n-1; j<=2*i-2*n; j++) sni/=j;
это, то что я записал как
C++
1
/(2*i+1)/(2*i+2)
, сохранив соответствие кода естественной записи выражений для слагаемых.

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

А предъявил сначала другое решение потому, что цель была пнуть <как его там>, а он рекурентное решение просто бы не понял, он и простейшее очевиднейшее то, как видно, не понял без дополнительных разъяснений. Когда нарисовался противник посерьезнее, ударил козырем.

Если терзают сомнения, посмотри историю моих сообщений - я на последней неделе в аналогичной задаче разъяснял, что такие задачи надо делать через рекурентное соотношение, когда все, в том числе и Вы, херней какой-то маялись. Так что это еще вопрос, кто у кого чего содрал.

Цитата Сообщение от valeriikozlov Посмотреть сообщение
for (sni=1, j=3; j<=n+1; j++) sni/=j;// конечно "з хвоста" нежелательно. Кол-во операций деления в целом ведь не увеличивается (именно за счет этой строки).
Ответ не верен, пилите дальше.

Цитата Сообщение от valeriikozlov Посмотреть сообщение
Жалко нет зевающего смайлика.
Зевать Вам рано - я простых вопросов не предлагаю, и этот вопрос касается весьма важного аспекта практических вычислений. Так что рекомендую отнестись к тому, что я говорю, повнимательнее.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.12.2010, 15:24 #27
Напильнег, слушайте, все мы, обитатели форума, простые зеваки, давно поняли, что вы, ваше вундеркиндство, Гаусс, Эйлер, Даламбер и просто хороший человек в одном лице. Но вы так этим на каждом углу кичитесь, что, право, батенька, становится мерзко.
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
25.12.2010, 15:59 #28
Цитата Сообщение от silent_1991 Посмотреть сообщение
все мы, обитатели форума, простые зеваки, давно поняли,
Не все...
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
26.12.2010, 20:57 #29
silent_1991, вопрос на засыпку - чем жизнь от напильника отличается?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2010, 20:57
Привет! Вот еще темы с ответами:

Факториалы. - PascalABC.NET
!- это факториал.

факториалы - QBasic
sh(x)= x+ (x^3/3!) + (x^5/5!) +(x^7/7!)+... +(X^(2n+1)/(2n+1)!)

Факториалы - QBasic
Скажите, можно ли решить эту задачу: 2/1!+3/2!+4/3!...+11/10! Другим методом, кроме как через подпрограмму-функцию. Например просто...

Факториалы !! - Pascal
Народ помогите мне записать факториалы а то не знаю как правильно y= cos x=1- x^3/2!+x^3/4!+x^6/6!+...; X^3-это х в степени не...


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

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

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