Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
51 / 24 / 12
Регистрация: 10.10.2015
Сообщений: 107
1

Вычисление факториала в лабораторных

10.12.2015, 03:34. Показов 906. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
/**************************************
 Уважаемые коллеги. Я смотрю ваши задачи и вижу, что много
 задач связано с рядами, где нужно вычислить в цикле факториал.
 Обычно для вычисления произвольного факториала используется
 цикл от 1 до value. Но в рядах обычно используется факториал
 с увеличением значения. Можно оптимизировать такие вызовы.
 Вот собственно попытка. Хранить старое значение факториала
 и на его основе вычислять новое.
 Код можно использовать свободно.
***************************************/
double row_factorial(int value)
{
    // Предыдущее значение факториала
    static double old_f = 1.0;
    // Предыдущее число, для которого вычислялся факториал
    static int old_v = 1;
 
    // Теперь на основе сохраненного значения вычисляем новое
    int v;
    // Перемножаем числа в цикле
    for(v = old_v; v <= value; v++)
    {
        old_f = old_f * v;
    }
    // Сохраняем значение числа плюс единица
    old_v = v;
    return old_f;
}
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2015, 03:34
Ответы с готовыми решениями:

Неверное вычисление факториала
Добрый день. Подскажите, пожалуйста, где я неправ. Факториал вычисляется верно вплоть до 65...

Вычисление факториала от квадрата числа
программа работает, но что-то не так, факториал вычисляется неправильно. подскажите, в чем дело :(...

Вычисление факториала - корректировка кода
Чего здесь не хватает? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; void main(){ int n,i,k; printf...

Вычисление факториала с контролем ввода
Помогите написать программу вычисляющую факториал. Но нужна зашита от символов, отрицательных...

10
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
10.12.2015, 10:17 2
bsa916115, Правильный подход! Я вот, встречая повтор в вычислениях факториала, только головой качал, да языком щелкал. А теперь просто заложу эту тему в закладки и ссылаться буду.
Маленькое замечание. Случай value < old_v будет отрабатывать некорректно. Это, конечно, не часто встречается в вычислениях рядов, но для полноты картины... А если 2 факториала в разных местах? Тогода хотя бы сброс old_v, old_f предусмотреть. Хотя, Имхо, лучше правильно отрабатывать случай value < old_v.

Добавлено через 16 минут
bsa916115, Вот еще что в голову пришло. В тех же рядах, когда есть член вида (...)n новички его вычисляют через pow. Когда как эффективнее и проще вычислять следующий член на основе предыдущего. Ничего не говоря уж о том, что (-1)n считают через pow.
Вот как бы здесь провести разъяснительную беседу...
2
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
10.12.2015, 10:23 3
Цитата Сообщение от Байт Посмотреть сообщение
Я вот, встречая повтор в вычислениях факториала, только головой качал, да языком щелкал
извечная проблема новичков, особенно это
Цитата Сообщение от Байт Посмотреть сообщение
https://www.cyberforum.ru/cgi-bin/latex.cgi?{(...)}^{n} новички его вычисляют через pow.
Цитата Сообщение от Байт Посмотреть сообщение
https://www.cyberforum.ru/cgi-bin/latex.cgi?{(-1)}^{n} считают через pow
убивает
1
51 / 24 / 12
Регистрация: 10.10.2015
Сообщений: 107
10.12.2015, 15:04  [ТС] 4
Да, я согласен, коллеги, это именно вариант, когда следующее значение value больше предыдущего. И не для сложных решений. Это самое простое для решения лаб про ряды. Не для многопоточности.
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
10.12.2015, 16:05 5
Цитата Сообщение от bsa916115 Посмотреть сообщение
когда следующее значение value больше предыдущего
Ну, там добавить 2 строки
C
1
2
3
4
if (value > old_v) {
  old_v = 1;
  old_f = 1.0;
}
Цитата Сообщение от bsa916115 Посмотреть сообщение
Не для многопоточности.
Да о ней и речи быть не может, коль static.
Да и не до того нашим новичкам! На крайняк, можно все эти вычисления вытащить из функции и считать в майне.
Да дело-то и не в этом. При стандартном (новичковском) подходе для расчета 100! снова происходит умножение 100 чисел, когда 99! уже вычислен, и почти все умножения уже сделаны
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
11.12.2015, 13:23 6
Цитата Сообщение от bsa916115 Посмотреть сообщение
Не для многопоточности.
А вот, например, принципиально распараллеливаемый алгоритм, за логарифм по времени:

C
1
2
3
typedef unsigned long long int ull;
 
ull f(int a, int b) {int c=a+(b-a)/2; return a==b ? a : f(a,c)*f(c+1,b);}
0
51 / 24 / 12
Регистрация: 10.10.2015
Сообщений: 107
11.12.2015, 13:31  [ТС] 7
Уважаемые коллеги.
Я очень благодарен всем за комментарии к моему исходнику.
Вы можете свободно пользоваться им, модифицировать и выкладывать под своим именем.
Согласен, попсовая программа для попсовых задач.
А если на несколько потоков, то я бы описал структуру из тех статических переменных, что описаны в начале.
Ну фантазий у меня много
1
2686 / 2258 / 244
Регистрация: 03.07.2012
Сообщений: 8,216
Записей в блоге: 1
11.12.2015, 14:59 8
Не доходит до меня, зачем эта тема.
Допустим, надо посчитать для x=0.2 сумму от 1 до n ряда по k: https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{x^k}{k!}
Можно циклом
C++
1
2
3
4
5
6
7
double  s=0.;
double  z=1.;
double x=0.2;
for (int k=1;k<=n;++k) {
      z=z*x/k;
       s+=z;
}
Можно циклом
C++
1
2
3
4
5
6
7
8
9
double  s=0.;
double  z=1.;
double x=0.2;
int f=1; // считается факториал
for (int k=1;k<=n;++k) {
      z=z*x;
      f*=k;
       s+=z/f;
}
Как будет выглядеть вариант с функцией и чем он проще/понятней/лучше?
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
11.12.2015, 15:23 9
Цитата Сообщение от zer0mail Посмотреть сообщение
Не доходит до меня, зачем эта тема.
Ваш код совершенно грамотен и верен. Но в том и дело, что большинство новичков вычисляют каждый член ряда "с нуля". Что а) неэффективно. б) неточно и чревато ошибками из-за возможно больших значений в промежуточных вычислениях. в) демонстрирует недостаточную математическую культуру кодирующего.
Вот именно борьбе с этой пагубной практикой и посвящен в основном этот топик. И, ИМХО, тема очень нужная и актуальная.
Цитата Сообщение от zer0mail Посмотреть сообщение
Как будет выглядеть вариант с функцией и чем он проще/понятней/лучше?
А функция - дело десятое
0
2686 / 2258 / 244
Регистрация: 03.07.2012
Сообщений: 8,216
Записей в блоге: 1
11.12.2015, 15:33 10
Я бы сказал "месье знают толк в извращениях". Вместо очень кривой дороги предлагают просто кривую.
0
51 / 24 / 12
Регистрация: 10.10.2015
Сообщений: 107
11.12.2015, 16:21  [ТС] 11
Спасибо, Байт.

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

Не в тему конечно.
0
11.12.2015, 16:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2015, 16:21
Помогаю со студенческими работами здесь

Вычисление факториала с помощью рекурсии
Ищу помощи у вас добрые люди. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; double...

Вычисление факториала числа, большего 12
Привет всем! Есть программка, считающая факториал числа. Но, если число на входе больше 12, выдает...

Вычисление факториала без использования функций
Вычисление факториала на языке СИ через функцию // Вычисление факториала на языке СИ через функцию...

Вычисление факториала: адаптировать код под Dev C++
У меня такая проблема...писала прогу для старой версии си++, а переписать на dev c++ затрудняюсь......


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru