Компьютерный форум
Правила
Вернуться   Компьютерный форум > Компьютерные форумы > Любые вопросы от новичков
Перезагрузить страницу Библиотека gmp c++
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Tasbka Tasbka вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.03.2012
По умолчанию Библиотека gmp c++ - 11.03.2012, 22:44

Доброго времени суток всем!
Нужно запрограммировать формулу
P = m!/(m^m * n_1! * n_2! * ... * n_m!), где n_1 + n_2 + ... n_m = m

В моем случае нужно расчитать для m = 24
(записывая возможные комбинации n_i и соответствующие значения P в текстовый файл)
применить стандартные типы с++ не получится - выходит за границы
выход - применение библиотеки gmp
вот что получилось:
cpp Код:
#include <iostream>
#include <gmp.h>
#include <cstdlib>
#include <stdio.h>

using namespace std;
unsigned long int const n = 4;
FILE *comb, *prob;

void f(int level,unsigned long int sum[], unsigned long int m,unsigned long int mas[], unsigned long int l)  //функция для вложенных циклов
{
   
    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
    unsigned long int  ii[n];
    for (int j = 0; j < n; j++)
        {
            ii[j] = 0;
           
            mpz_init(factorial[j]);
        }
   

    if(level < n-1)
        {for(ii[level] = n - sum[level]; ii[level] >= 0; ii[level]--)
        {
            sum[n - ii[level] + 1] += sum[n - ii[level]];
            mas[level] = ii[level];
            f(level+1, sum, n, mas, n);
         
        }
    }
        else        
    {
        mpz_set_ui(znam,1);
        mas[level] = n - sum[level];
        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),4, prob);
        for (int j = 0; j < n; j++)     // запись в файл комбинаций
            {
                sum[j] = 0;
                fwrite (&mas[j], 4, 1, comb);  
                fwrite (" ; ", 5, 3, comb);
            }
        fwrite (" \n ", 5,3, comb);
    }
   
    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()
{
    comb = fopen("comb.csv","w");
    prob = fopen("prob.csv","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);          
    fclose(comb);
return 0;

}

компилирует нормально, при запуске make-файла выводит
GNU MP: Cannot allocate memory (size=486547464)
Аварийная остановка

Помогите разобраться
Ответить с цитированием
  (#2 (permalink)) Старый
Tasbka Tasbka вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.03.2012
По умолчанию 13.03.2012, 00:41

Разобралась сама
нужно было поставить другой тип:
cpp Код:
unsigned long int  ii[n];
=>
cpp Код:
int  ii[n];

ну и еще несколько попутных ошибок есть
Ответить с цитированием
Ads
Ответ

Метки
gmp , с/c++

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БИБЛИОТЕКА ПО ПРОЛОГУ!!! Винитарх Prolog 88 09.12.2015 01:58
библиотека api Иван1 Assembler 8 26.08.2011 18:48
Библиотека jonko Prolog 6 12.12.2009 22:43
Библиотека Boost C++ egork2 Visual C++ 7 11.06.2008 12:44
Qt dll библиотека как с ней работать just_vladimir Trolltech Qt 8 15.11.2007 23:21
Библиотека имени Ленина Зирк Юмор 2 04.08.2006 11:09
DLL библиотека как с ней работать Хиларион Delphi 5 17.07.2006 23:54
Библиотека dll на MSVC++ 6.0 SSCorp Delphi 6 23.06.2006 12:28
С++ библиотека для покетов Racheengel Windows CE 0 16.01.2006 17:16
Не загружается библиотека DLL uran238 Visual C++ 5 08.03.2005 17:32
Ресурсы и DLL библиотека sadhoo Delphi 2 10.06.2004 17:19
Переносимая библиотека XML imported_John С/С++ 1 19.02.2003 11:56



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов