Форум программистов, компьютерный форум 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Напильнег
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++
 Аватар для valeriikozlov
4660 / 2486 / 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++
 Аватар для valeriikozlov
4660 / 2486 / 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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.12.2010, 15:24     Факториалы... #27
Напильнег, слушайте, все мы, обитатели форума, простые зеваки, давно поняли, что вы, ваше вундеркиндство, Гаусс, Эйлер, Даламбер и просто хороший человек в одном лице. Но вы так этим на каждом углу кичитесь, что, право, батенька, становится мерзко.
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
25.12.2010, 15:59     Факториалы... #28
Цитата Сообщение от silent_1991 Посмотреть сообщение
все мы, обитатели форума, простые зеваки, давно поняли,
Не все...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2010, 20:57     Факториалы...
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
26.12.2010, 20:57     Факториалы... #29
silent_1991, вопрос на засыпку - чем жизнь от напильника отличается?
Yandex
Объявления
26.12.2010, 20:57     Факториалы...
Ответ Создать тему
Опции темы

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