Форум программистов, компьютерный форум CyberForum.ru

Генератор разбиений числа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
MOLK
0 / 0 / 0
Регистрация: 22.09.2011
Сообщений: 30
26.10.2011, 01:14     Генератор разбиений числа #1
У нас есть шаблон структуры всех разбиений числа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//-- Gen.h 
#pragma  once 
namespace combi      
{
struct  partition  // генератор разбиений целого числа   
  {
short n,    // исходное число
sn,     // количество элементов в текущем разбиении
        q;        // индекс текущего элемента для разбиения
    int  *sset;     // указатель на массив текущего разбиения
    partition (short n); // конструктор
    bool getfirst ();      // получить начальное разбиение
    bool getnext();    // получить разбиение
  };
};
Реализация методов структуры partition:
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
//-- Gen.cpp 
#include "stdafx.h"
#include <iostream>
#include "Gen.h" 
namespace combi
{
 partition::partition(short n) 
{
    this->n = n; this->sn = 0; this->q = 0;
    this->sset= new int [n];
    }
 bool partition::getfirst() 
 {
    bool rc = true;
    this->sset[0] = this->n; this->sn = 1;
if (rc  =  (this->n >= 0))  this->q = (this->n <= 1)?-1:0;
    return rc;
 }
bool partition::getnext()
{
 bool rc = true;
  if (rc = (this->q >= 0))
    if (this->sset[q] == 2)
     { this->sset[this->q--] = 1; this->sset[(++this->sn)-1] = 1;} 
    else 
     {
        --this->sset[q];
        int  nx  =  this->sn - this->q; 
        this->sn =  (this->q + 1)+1;     
         while (nx > this->sset[q]) 
             {
              this->sset[this->sn-1] = this->sset[q];  
              this->sn++; nx -= this->sset[q];
             };
         this->sset[sn-1] = nx; 
         this->q = (this->sn-1) -((nx == 1)?1:0);
     }; 
  return rc;
};
}
Пример применения генератора для построения всех разбиений числа 7:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Main  
//
#include "stdafx.h"
#include "Gen.h"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "rus");
combi::partition p(7);
bool iscontinue  = p.getfirst();
std::cout<<"Разбиение числа 7";
while(iscontinue)
{
 std::cout<<std::endl; 
 for (int i = 0; i < p.sn; i++)std::cout<<p.sset[i]<<", " ; 
 iscontinue = p.getnext();
};
std::cout<<std::endl; 
system("pause");
return 0;
}
Подскажите, пожалуйста, куда надо вписывать эти коды, чтобы программа заработала?
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 01:14     Генератор разбиений числа
Посмотрите здесь:

генератор чисел C++
Даны натуральные числа M, N. Поменять одну из цифр первого числа с цифрой второго числа, чтобы получившиеся числа были взаимно простыми C++
C++ Генератор числа от -1 до 1
C++ Генератор паролей
C++ Подсчитать количество различных разбиений числа N на натуральные слагаемые
C++ Вывести одно целое число– количество возможных разбиений войска на отряды
Очередь целых чисел, генератор случайного числа, и задача C++
Генератор на С++ C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 04:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru