Доброго времени суток всем!
Необходимо запрограммировать формулу
P = n!/(n^n * m_1! * m_2! * ... * m_n!), где m_1 + m_2 + ... m_n = n
В моем случае нужно расчитать для n = 24
(записывая возможные комбинации n_i и соответствующие значения P в текстовый файл)
применить стандартные типы с++ не получилось - выходит за границы
Возможное решение - применение библиотеки gmp
вот что получилось:
#include <iostream>
#include <gmp.h>
#include <cstdlib>
#include <stdio.h>
using namespace std;
unsigned long int const n = 2;
FILE *comb, *prob;
void f(int level,unsigned long int sum[], unsigned long int m,unsigned long int mas[], unsigned long int l)
{
unsigned long int ii[n];
for (int j = 0; j < n; j++)
{
ii[j] = 0;
}
if(level < n-1)
{for(ii[level] = n - sum[level]; ii[level] >= 0; ii[level]--)
{
sum[level + 1] = ii[level] + sum[level];
mas[level] = ii[level];
f(level+1, sum, n, mas, n);
}
}
else
{
mpf_t P, d1, d2;
mpz_t N, div, factorial[n],znam, chisl;
mpz_init(div);
mpz_init(N);
mpz_init(znam);
mpz_init(chisl);
mpf_init(P);
mpf_init(d1);
mpf_init(d2);
mpz_fac_ui(chisl,n); //числитель = (n)!
mpf_set_z(d1,chisl); // из int в float
mpz_set_ui(N,n); // запись в N = n
mpz_pow_ui(div,N,n); // n в степени n
mpz_set_ui(znam,1); // знаменатель = 1
mas[level] = n - sum[level]; // ??
for (int j = 0; j < n; j++)
mpz_init(factorial[j]);
for (int i = 0; i < n; i++)
mpz_fac_ui(factorial[i],mas[i]); // вычисляем факториалы в знаменателе
for (int i = 0; i < n; i++)
mpz_mul(znam, znam, factorial[i]); // перемножаем факториалы в знаменателе
mpz_mul(znam,znam,div); // общий знаменатель (факториалы и степень)
mpf_set_z(d2,znam); // из int в float
mpf_div(P,d1,d2); // нахождение вероятности для данной комбинации
mpf_out_str(prob,10,33,P); // запись в файл вероятности
fwrite (" ; \n", sizeof(char),1, prob);
/*for (int j = 0; j < n; j++) // запись в файл комбинаций
{
fwrite (&mas[j], 4, 1, prob);
fwrite (";", 1, 1, prob);
} */
fwrite ("\n", 2, 1, prob);
mpf_clear(P);
mpf_clear(d1);
mpf_clear(d2);
mpz_clear(N);
mpz_clear(div);
mpz_clear(znam);
mpz_clear(chisl);
for (int y = 0; y < n; y++)
mpz_clear(factorial[y]);
}
}
int main()
{
prob = fopen("prob.txt","w");
int level = 0;
unsigned long int sum[n], mas[n];
for (int k = 0; k < n; k++)
{
mas[k] = 0;
sum[k] = 0;
}
f(level,sum,n,mas,n);
fclose(prob);
return 0;
}
Компилируется без ошибок, но при запуске make-файла выводит Cannot allocate memory (size=486547464) и происходит аварийное завершение программы. Подскажите, в чем проблема?