Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978

Вычисление (2n)!/(n!*n!)

24.06.2017, 11:54. Показов 2773. Ответов 22

Студворк — интернет-сервис помощи студентам
В одной комбинаторной задаче мне пришлось столкнуться с необходимостью такого вычисления
Простой вариант
C++
1
2
3
4
   long long KPL = 2;  // Кол-во позиций
   for(i=N+1; i<2*N; i++) KPL *= i;
   for(i=2; i< N; i++) KPL /= i;
   long KP = (LU)KPL;
Позволил правильно считать до N = 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
int nod(int a, int b)
{  int t;
   while(a) {
     if (a < b) {
       t = a;
       a = b;
       b = t;
     }
     a = a % b;
   }
   return b;
}
// ---------
unsigned long N2N(int n)  // (2n)! / (n!*n!)
{ int chis[40], znam[40];  // Сомножители числителя и знаменателя
  int i, j;
  unsigned long res = 1;
   for(i=0; i<n; i++) {
     chis[i] = 2*n - i;
     znam[i] = n - i;
   }
   for(i=0; i<n; i++) {
     for (j=0; j<n; j++) {
       int nd = nod(znam[i], chis[j]);
       znam[i] /= nd;
       chis[j] /= nd;
       if (znam[i]==1) break;
     }
   }
   for(j=0; j<n; j++)  res *= chis[j];
   return res;
}
// ---------
Удалось досчитать до 17 (= 2 333 606 220). Дальше снова чушь.
Скорее всего, это предел для 32-разрядного long.
double не по.дходит, так как потом мне по этому числу надо память выделять...

Добавлено через 1 минуту
Длинная арифметика, естественно, тоже не катит...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.06.2017, 11:54
Ответы с готовыми решениями:

Оформить в виде функции вычисление среднеарифметического, вычисление суммы и произведения чисел
2. Даны три числа. Оформить в виде функции вычисление среднеарифметического, вычисление суммы и произведения этих чисел.

Вычисление периметра(вычисление расстояния между вершинами реализовать в виде функции)
даны координаты вершин многоугольника (X1,Y1), (X2,Y2),...(Xn,Yn). Напишите программу для вычисления его периметра( вычисление расстояния...

Возведение в степень по модулю, вычисление НОД, вычисление инверсии
Доброго времени суток. Для реализации RSA нужны 3 функции &quot; возведение в степень по модулю (а^x mod p) Вычисление наибольшего общего...

22
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.06.2017, 01:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Байт Посмотреть сообщение
Стандартный новичок решил бы эту задачу просто
Простота - хоть и хуже воровства, но и признак гениальности. Всё новое - хорошо позаимствованное старое, иными словами. Мой калькулятор, умеет кстати, выбирать наиболее безопасную последовательность операций. Там есть настройка вот такая как на первом рисунке. Интересно, что и калькулятор (aneasycalc) и прога на С++ дают сходные результаты до N=29 включительно. Закрадыва5ется мысль о том, что природа боится тридцати...
Вот для N=25, 29, 30

c++
25 126410606437752
aneasycalc
25 126410606437752

c++
29 30067266499541040
aneasycalc
29 3,0067266499541100e16// больше 14-15 знаков double не даёт)

3,00672664995411E+16


c++
30 13 296 419 443 632 953 088 ( порядка 1,3e19 )
aneasycalc
30 1,18264581564861E+17 // лажа конечно
А это совсем непонятно. Нужно посмотреть...
Миниатюры
Вычисление (2n)!/(n!*n!)   Вычисление (2n)!/(n!*n!)  
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.07.2017, 15:45  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Решил воспользоваться "ручным" алгоритмом
Увы, все это оказалось полной глупостью и мазохизмом. Листая старые подписки, нашел вот такой изящный вариант вычисления Cnk
По заданным натуральным n и k необходимо вычислить число сочетаний из n элементов по k
Проблемы переполнения разрядной сетки это не снимает, но выглядит значительно изящнее, и, что самое смешное, работает правильно.
Особая благодарность уважаемому zer0mail
У участников же данного обсуждения нижайше прошу прощения за столь долгое морочание светлых голов.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.07.2017, 19:38
Цитата Сообщение от Байт Посмотреть сообщение
Увы, все это оказалось полной глупостью и мазохизмом.
Преодоление логики путём умерщвления бренной плоти, это конечно крайняя мера.
Я всегда удивлялся, почему бином, - Ньютона, а треугольник, - наоборот, - Паскаля... Ч-черт. При n=2m Cnm вырождается в Вашу формулу и, действительно, может быть посчитано гораздо легче.

Добавлено через 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <list>
using namespace std;
 
unsigned c_n_m(unsigned n, unsigned m){
if(!n || !m || (m>=n)) return 1;// шара)))
unsigned res=1;
unsigned mm=m, np1=n-m+1, nmax=n+1;
list<long> dividers;
for( ; mm>0; --mm)dividers.push_back(mm);
 
list<long>::iterator it_to_del, dividers_it=dividers.begin(), dividers_end=dividers.end();
 
for( ; np1<nmax; ++np1){
res*=np1;
dividers_it=dividers.begin();
dividers_end=dividers.end();
for( ; dividers_it != dividers_end; ++dividers_it){
    if(res% *dividers_it == 0 && *dividers_it != 1){
res/=*dividers_it;
dividers.erase(dividers_it); 
dividers_it=dividers.begin();
dividers_end=dividers.end();
 
    }
}
}
 
return res;
}
 
long c(long n, long k)
{
    if ((n==k) || (k==0))
       return 1;
    else
       return c(n-1,k-1)+c(n-1,k);
}        
 
int main(int argc, char* argv[])
{
int m, n;
n=30;
m=15;
//n=44;
//m=22;
long c_nm=c_n_m(n,m);
//long cr_nm=c(n,m);
 
cout<<c_nm<<endl;
//cout<<cr_nm<<endl;
system("pause");
return 0;
}
А грубая горилла - рулит!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2017, 19:38

Вычисление непрерывных дробей и выражений. Вычисление полиномов и их производных.
1. Чему равна знакочередующаяся сумма цифр числа n. 2. Даны натуральное число n и вещественное число х. Составить программу для...

Вычисление факториала и вычисление степени числа
Нужно проверить правильность сделанной программы если не правильно помогите исправить. Var a,a1,a2,a3,x,c,st,otvet:real; ...

Вычисление функции отключено, поскольку истекло время, выделенное на вычисление предыдущей функции
Подскажите пожалуйста, загружаю файл на ftp: WebClient myWebClient = new WebClient(); Uri ftp_path = new...

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


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru