Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2010, 15:36   #1
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Необходимо составить следующий алгоритм:

1. Входные данные: int length;
2. Выходные данные: сочетания без повторений всех порядков.

Пример:

1. length = 5;
2. Выход:

0
1
2
3
4

01
02
03
04
12
13
14
23
24
34

012
013
014
023
024
034
123
124
134
234

0123
0124
0134
0234
1234

01234

Код:
int LEN = 5;
int bases = new int[ LEN ];
Для сочетаний по два:
Код:
for( bases[ 0 ] = 0; bases[ 0 ] < LEN; bases[ 0 ]++ )
    for( bases[ 1 ] = bases[ 0 ] + 1; bases[ 1 ] < LEN; bases[ 1 ]++ )
        std::cout<<bases[ 0 ]<<" "<<bases[ 1 ]<<std::endl;
Для сочетаний по три:
Код:
for( bases[ 0 ] = 0; bases[ 0 ] < LEN; bases[ 0 ]++ )
    for( bases[ 1 ] = bases[ 0 ] + 1; bases[ 1 ] < LEN; bases[ 1 ]++ )
        for( bases[ 2 ] = bases[ 1 ] + 1; bases[ 2 ] < LEN; bases[ 2 ]++ ) 
            std::cout<<bases[ 0 ]<<" "<<bases[ 1 ]<<std::endl;
И так далее. Помогите пожалуйста собрать всё это в одно( чтобы в одном цикле выводились сочетания всех порядков ).

Последний раз редактировалось Stilet; 01.11.2010 в 09:48.
nowaalex вне форума Ответить с цитированием
Старый 31.10.2010, 20:49   #2
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Цитата:
сочетания без повторений всех порядков
Сочетания чего?
Каких порядков?
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 31.10.2010, 20:55   #3
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

Действительно задай свой вопрос более корректно.
Хорошо сформулированный вопрос это уже половина ответа
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 31.10.2010, 21:28   #4
yury_coder
Пользователь
 
Регистрация: 31.10.2010
Сообщений: 53
По умолчанию

В данном случае нужно вывести на экран последовательности всех размеров начиная с минимальных. То есть, сначала должно идти:
1
2
3
4
5
потом:
12
13
14
15
23
...
потом:
123
124
125
134
135
145
234
...
и так до
12345

Последний раз редактировалось yury_coder; 31.10.2010 в 21:31.
yury_coder вне форума Ответить с цитированием
Старый 31.10.2010, 21:38   #5
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Цитата:
всех размеров начиная с минимальных
Размеры чего мы должны вывести, пенсий, заработной платы, груди анджелины джоли? Дословно задачу выложите, а то уже как то любопытно стало, что же это за размер.
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 31.10.2010, 21:42   #6
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Это делается для генерирования идеальной хеш-таблицы. Алгоритм очень длинный и я по понятным причинам не буду тут его весь постить.
Например у нас есть строка "abcde". Нужно получить из неё все возможные сочетания по 1, по 2, по 3, по 4 и по 5. Если бы в строке было 6 символов, то, соответственно, и порядков было бы тоже 6.
Нужно получить:
a
b
c
d
e

ab
ac
ad
ae
bc
bd
be
cd
ce
de

И так далее
nowaalex вне форума Ответить с цитированием
Старый 31.10.2010, 21:45   #7
yury_coder
Пользователь
 
Регистрация: 31.10.2010
Сообщений: 53
По умолчанию

есть строка "abcdefg"

нужно перебрать и отдельно вывести все последовательности

a
b
...
ab
...
abc
...
abcd
...

это всё по закону, описанному выше
yury_coder вне форума Ответить с цитированием
Старый 31.10.2010, 22:26   #8
yury_coder
Пользователь
 
Регистрация: 31.10.2010
Сообщений: 53
По умолчанию

решение найдено, даже два
yury_coder вне форума Ответить с цитированием
Старый 01.11.2010, 00:29   #9
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Кому интересно(решение без рекурсии):
Код:
    int LEN = 4;
    unsigned char * bases = new unsigned char[ LEN ];
    for( int order = 0; order < LEN; order++ )
    {
        for( int j = 0; j <= LEN; j++ )
            bases[ j ] = j;

        for( ;; )
        {
            for( int k = 0; k <= order; k++ )
                std::cout<<( int )bases[ k ];
            
            std::cout<<"\n";
            
            if( bases[ 0 ] + order == LEN )
                break;
            
            for( int p = order; p >= 0; p-- )
            {
                if( bases[ p ] - p < LEN - order )
                {
                    bases[ p ]++;
                    if( p != order )
                        for( int c = p; c < order; c++ )
                            bases[ c + 1 ] = bases[ c ] + 1;
                    break;
                }
            }
        }
    }

Последний раз редактировалось nowaalex; 01.11.2010 в 00:43.
nowaalex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны цифры от 1 до 38 нужно составить все возможные комбинации из 6 чисел без повторений. gector Фриланс 14 01.04.2013 20:20
Получить массив из элементов, встречающихся в исходном массиве ровно один раз без повторений Shikarmo4000 Помощь студентам 0 25.05.2010 01:27
Delphi. random, случайные числа без повторений MerCY Помощь студентам 8 10.05.2010 15:19
Random вывод нескольких чисел без повторений leonw Общие вопросы Delphi 4 05.09.2009 13:15
Массив без повторений Uzenec Помощь студентам 2 17.01.2008 08:23