Имя: Пароль:
1C
1С v8
Нужна обработка для составления сочетаний чисел из n элементов по m(k)
0 VNikola
 
22.04.15
15:21
На работе дали задание составить все комбинации чисел (к примеру: длина комбинации 10 из ста).
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 11
1 2 3 4 5 6 7 8 9 12
и т.д.
комбинации нужно чтобы не повторялись.
Я уже неделю сижу, бьюсь, а результатов не добился.
Для расчета количества комбинаций я воспользовался формулой сочетаний (Cnm) получил число сочетаний, а вот дальше тупик.
ПОМОГИТЕ КТО ЧЕМ МОЖЕТ!
1 asady
 
22.04.15
15:25
(0) самый простоя алгоритм:
1. Генератором случайных числе генерим массив из 10 чисел (из 100)
2. проверяем есть ли такое число уже в массиве комбинаций.
3. если нет то добавляем его в массив комбинаций
4. переходим к новой итерации
5 остановка по достижению массивом размера числа сочетаний или по прерыванию пользователя.
2 Fragster
 
гуру
22.04.15
15:26
(1) нафига это всё?
3 mikecool
 
22.04.15
15:27
(2) такой же вопрос и к (0) ))
4 Fragster
 
гуру
22.04.15
15:28
(3) ну, к (0) - это лабораторная, наверное...
5 asady
 
22.04.15
15:28
(2) прикольно сидеть и смотреть как она последний элемент ищет
6 pessok
 
22.04.15
15:29
(4) (0) пишет, что "на работе"
7 ВРедная
 
22.04.15
15:31
(1) Зачем генератором, 10 циклов в цикле или рекурсивный вызов не подойдет?

Для И = 1 по 100 Цикл
  Для К = И + 1 по 100 Цикл
        Для Л = К + 1 по 100 Цикл
           МассивКомбинаций.Добавить("" + И + К + Л);
8 ifso
 
22.04.15
15:33
(6) "Все хлеба поубраны, всё посдали загодя" (с)
9 asady
 
22.04.15
15:33
(7) ну это не интересно. так любой может
а тут запустил процесс и наслаждайся её муками подбора
и чувствуй себя королем - хочу остановлю её труд, хочу нет.
10 Михаил Козлов
 
22.04.15
15:44
С(100,10) это примерно 15 знаков в десятичной записи.
Не многовато будет? Результат куда будете помещать?
11 jsmith82
 
22.04.15
15:57
Это должна быть рекурсивная функция
12 jsmith82
 
22.04.15
15:58
Функция НайтиКомбинации(Длина, Диапазон)

КонецФункции
13 jsmith82
 
22.04.15
15:59
На выходе массив массивов
14 jsmith82
 
22.04.15
16:00
Уже полчаса голову ломаю. Решение нашёл. Формализовать трудно
15 VNikola
 
22.04.15
16:11
Через ГСЧ я пробовал.  долго ни не эффективно.
сочетания могут быть разными 12 из 100 или 10 из 60 ( к примеру при расчете комбинаций 10 из 100 получается что их можно составить 17310309456440) при таком раскладе у меня 1С зависла на час после я ее срубил потому что успела перебрать тока примерно 2-6%
16 jsmith82
 
22.04.15
16:18
Ха! Мозги не пропиты! Решил
17 jsmith82
 
22.04.15
16:19
Правда только текст функции написал
18 jsmith82
 
22.04.15
16:19
Функция НайтиКомбинации(Длина, Диапазон)
    
    Если Длина = 1 Тогда
        
        ГлавныйМассив = Новый Массив();
        Массив = Новый Массив();
        Для Итер = 1 По Диапазон Цикл
            Массив.Добавить(Итер);
        КонецЦикла;
        ГлавныйМассив.Добавить(Массив);
        Возврат ГлавныйМассив;        
        
    Иначе
        
        Правый = НайтиКомбинации(Длина - 1, Диапазон);
        
        ГлавныйМассив = Новый Массив();
        
        Для Итер = 1 По Диапазон Цикл
            
            Массив = Новый Массив();
            Массив.Добавить(Итер);
            
            Для Каждого Строка Из Правый Цикл
                Для Каждого Эл Из Строка Цикл
                    Массив.Добавить(Эл);
                КонецЦикла;
            КонецЦикла;
            
            ГлавныйМассив.Добавить(Массив);            
            
        КонецЦикла;
        
    КонецЕсли;
        
    КонецФункции
19 jsmith82
 
22.04.15
16:20
Щас проверю в 1с
20 jsmith82
 
22.04.15
16:45
Ошибка. Допилить надо
21 jsmith82
 
22.04.15
16:45
Лень покамест
22 Гёдза
 
22.04.15
17:09
задача гуглится нараз два
23 jsmith82
 
22.04.15
21:55
Ха! Мозги не пропиты! Решил
24 jsmith82
 
22.04.15
21:56
Функция НайтиКомбинации(Длина, Диапазон)
    
    Если Длина = 1 Тогда
        
        ГлавныйМассив = Новый Массив();
        
        Для Итер = 1 По Диапазон Цикл
            Массив = Новый Массив();
            Массив.Добавить(Итер);
            ГлавныйМассив.Добавить(Массив);
        КонецЦикла;
        
        Возврат ГлавныйМассив;        
        
    Иначе
        
        Правый = НайтиКомбинации(Длина - 1, Диапазон);
        
        ГлавныйМассив = Новый Массив();
        
        Для Итер = 1 По Диапазон Цикл                        
            
            Для Каждого Строка Из Правый Цикл
                
                Массив = Новый Массив();
                Массив.Добавить(Итер);
                Для Каждого Эл Из Строка Цикл
                    Массив.Добавить(Эл);
                КонецЦикла;
                ГлавныйМассив.Добавить(Массив);
            КонецЦикла;                        
            
        КонецЦикла;
        
        Возврат ГлавныйМассив;
        
    КонецЕсли;
    
КонецФункции
25 VNikola
 
23.04.15
17:11
jsmith82 Спасибо! Очень помогло!