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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ разработать программу для МПУ.На С http://www.cyberforum.ru/cpp-beginners/thread372699.html
разработать программу для МПУ, для контроля и индикации параметров изменяющегося по случайному закону 8_разрядного двоичного кода. Результаты контроля должны выводиться на индикатор. Скорость изменения кода, пределы его изменения, время контроля и контроль параметров приведены: Параметры кода: _Скорость изменения кода ед/с 10000 _Пределы изменения числового значения кода 00000000-11111111...
C++ препроцессор, #if Создаю файл: #define PARAM ABC #if PARAM == ABC #warning warning passed #endif #if PARAM == XXX #error error reached #endif http://www.cyberforum.ru/cpp-beginners/thread372691.html
Найти сумму числовых значений цифр, содержащихся в строке (используя switch) C++
Мне требуется: Написать программу, которая считывает строку символов, состоящую только из латинских букв, цифр и пробелов (с проверкой символов при вводе), и находит сумму числовых значений цифр, содержащихся в строке. Как это сделать используя оператор свич. Желательно с живым примером.
Map и указатель на ф-цию C++
Вечер добрый, перешел на вижуал студио с МС компилером, после мингы, не могу понять почему данный код на мингве успешно выполняется, а на МС компилере нет: bool comp (const std::string &left_str, const std::string &right_str) { return (left_str > right_str) ? true : false; }
C++ В одномерном массиве вычислить минимальный элемент http://www.cyberforum.ru/cpp-beginners/thread372676.html
В одномерном массиве, состоящем из п вещественных элементов, вычислить: - минимальный элемент массива; - сумму элементов массива, расположенных между первым и последним положительными элементами. void main() { setlocale(LC_ALL,"Russian"); int arr; int n,count=0,summ=0; bool x; scanf("%d",&n);
C++ те же перестановки Вот опять задачка на перестановки, если кому интересно, или кому просто не трудно сделать, буду очень признателен! Заранее огромное спасибо. Дана последовательность 1, ... , n. Нужно найти все перестановки этой последовательности так, чтобы числа стоящие на своих позициях не вставали на них снова, и посчитать кол-во этих перестановок. т.е. например 1, 2, 3. это 2, 3, 1 и 3, 1, 2. кол-во = 2;... подробнее

Показать сообщение отдельно
MOLK
0 / 0 / 0
Регистрация: 22.09.2011
Сообщений: 30

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

26.10.2011, 01:14. Просмотров 1336. Ответов 0
Метки (Все метки)

У нас есть шаблон структуры всех разбиений числа:
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;
}
Подскажите, пожалуйста, куда надо вписывать эти коды, чтобы программа заработала?
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru