LINUX.ORG.RU

Сообщения Zarazka

 

Cannot allocate memory

Форум — Development

Доброго времени суток всем!
Необходимо запрограммировать формулу
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) и происходит аварийное завершение программы. Подскажите, в чем проблема?

Zarazka
()

RSS подписка на новые темы