Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Перебрать комбинации цифр - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Перебрать комбинации цифр
Alex_100 Дата: Понедельник, 15.09.2014, 07:20 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Помогите, пожалуйста, перебрать все комбинации цифр от 1 до 4
Например дано 1 2 3 4 , в результате получим:
1111
1112
1113
1114
2222
2221
......

Но не должно быть комбинаций состоящих из одинакового набора цифр. Например: Если есть 1112 то 2111 уже не должно быть.
П.С. Понимаю, что комбинаторика и перебор, но уже ни сил нет, ни голова не соображает - всю ночь сижу.
Заранее благодарен
 
Ответить
СообщениеПомогите, пожалуйста, перебрать все комбинации цифр от 1 до 4
Например дано 1 2 3 4 , в результате получим:
1111
1112
1113
1114
2222
2221
......

Но не должно быть комбинаций состоящих из одинакового набора цифр. Например: Если есть 1112 то 2111 уже не должно быть.
П.С. Понимаю, что комбинаторика и перебор, но уже ни сил нет, ни голова не соображает - всю ночь сижу.
Заранее благодарен

Автор - Alex_100
Дата добавления - 15.09.2014 в 07:20
alex1248 Дата: Понедельник, 15.09.2014, 08:15 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 384
Репутация: 71 ±
Замечаний: 0% ±

Excel 2007, 2010
Если есть 1112 то 2111

Макросом пока заниматься некогда, а вот с этим всё довольно просто. Достаточно, например, выбирать только те комбинации, в которых каждая следующая цифра не меньше предыдущей - и все повторы отсекутся.
Например,
1111
1112
1113
1114
1122
1123
1124
1133
1134
1144
1222, и т.д.


skype alex12481632
Qiwi +79276708519
 
Ответить
Сообщение
Если есть 1112 то 2111

Макросом пока заниматься некогда, а вот с этим всё довольно просто. Достаточно, например, выбирать только те комбинации, в которых каждая следующая цифра не меньше предыдущей - и все повторы отсекутся.
Например,
1111
1112
1113
1114
1122
1123
1124
1133
1134
1144
1222, и т.д.

Автор - alex1248
Дата добавления - 15.09.2014 в 08:15
ikki Дата: Понедельник, 15.09.2014, 10:55 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
для четырёх - можно тупо в лоб четырьмя циклами (для олимпиад по информатике такой способ не прокатит)[vba]
Код
Sub aTest()
     Dim i&, j1&, j2&, j3&, j4&
     For j1 = 1 To 4: For j2 = j1 To 4: For j3 = j2 To 4: For j4 = j3 To 4
         i = i + 1: Cells(i, 1) = j1 & j2 & j3 & j4
     Next j4, j3, j2, j1
End Sub
[/vba]


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениедля четырёх - можно тупо в лоб четырьмя циклами (для олимпиад по информатике такой способ не прокатит)[vba]
Код
Sub aTest()
     Dim i&, j1&, j2&, j3&, j4&
     For j1 = 1 To 4: For j2 = j1 To 4: For j3 = j2 To 4: For j4 = j3 To 4
         i = i + 1: Cells(i, 1) = j1 & j2 & j3 & j4
     Next j4, j3, j2, j1
End Sub
[/vba]

Автор - ikki
Дата добавления - 15.09.2014 в 10:55
Саня Дата: Понедельник, 15.09.2014, 11:16 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
да, четыре цикла - это не есть бьютефул...
нужно было построить троичную с.и. и работать с ней... но оставим это для олимпиад.

бездумный вариант "в лоб":
[vba]
Код
Option Explicit

Sub m()
       Dim i As Integer, j As Integer, k As Integer, l As Integer
       Dim a(1 To 4) As Integer

       Dim sVal As String, sKey As String
       Dim colIt As New Collection

       On Error Resume Next
       For i = 1 To 4
           For j = 1 To 4
               For k = 1 To 4
                   For l = 1 To 4
                       a(1) = i
                       a(2) = j
                       a(3) = k
                       a(4) = l
                          
                       sVal = sGetString(a)
                       SortArray a
                       sKey = sGetString(a)

                       colIt.Add sVal, sKey
                   Next: Next: Next: Next
          
       Dim sMsg As String
       For i = 1 To colIt.Count
           sMsg = sMsg & colIt(i) & ", "   ' & vbTab  ' & vbNewLine  ' & ", "
       Next
       sMsg = Left$(sMsg, Len(sMsg) - 2)
          
       MsgBox sMsg
End Sub

Function SortArray(a() As Integer) As String
       Dim i As Integer, j As Integer
       Dim tmp As Integer

       For i = 1 To UBound(a) - 1
           For j = i + 1 To UBound(a)
               If a(i) > a(j) Then
                   tmp = a(j)
                   a(j) = a(i)
                   a(i) = tmp
               End If
           Next j
       Next i
End Function

Function sGetString(a() As Integer) As String
       Dim i As Integer, sRes As String
       For i = 1 To UBound(a)
           sRes = sRes & CStr(a(i))
       Next i
       sGetString = sRes
End Function
[/vba]
 
Ответить
Сообщениеда, четыре цикла - это не есть бьютефул...
нужно было построить троичную с.и. и работать с ней... но оставим это для олимпиад.

бездумный вариант "в лоб":
[vba]
Код
Option Explicit

Sub m()
       Dim i As Integer, j As Integer, k As Integer, l As Integer
       Dim a(1 To 4) As Integer

       Dim sVal As String, sKey As String
       Dim colIt As New Collection

       On Error Resume Next
       For i = 1 To 4
           For j = 1 To 4
               For k = 1 To 4
                   For l = 1 To 4
                       a(1) = i
                       a(2) = j
                       a(3) = k
                       a(4) = l
                          
                       sVal = sGetString(a)
                       SortArray a
                       sKey = sGetString(a)

                       colIt.Add sVal, sKey
                   Next: Next: Next: Next
          
       Dim sMsg As String
       For i = 1 To colIt.Count
           sMsg = sMsg & colIt(i) & ", "   ' & vbTab  ' & vbNewLine  ' & ", "
       Next
       sMsg = Left$(sMsg, Len(sMsg) - 2)
          
       MsgBox sMsg
End Sub

Function SortArray(a() As Integer) As String
       Dim i As Integer, j As Integer
       Dim tmp As Integer

       For i = 1 To UBound(a) - 1
           For j = i + 1 To UBound(a)
               If a(i) > a(j) Then
                   tmp = a(j)
                   a(j) = a(i)
                   a(i) = tmp
               End If
           Next j
       Next i
End Function

Function sGetString(a() As Integer) As String
       Dim i As Integer, sRes As String
       For i = 1 To UBound(a)
           sRes = sRes & CStr(a(i))
       Next i
       sGetString = sRes
End Function
[/vba]

Автор - Саня
Дата добавления - 15.09.2014 в 11:16
ikki Дата: Понедельник, 15.09.2014, 11:18 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
тут слегка сложнее
ээээ... кагбэ.... а у меня разве не так? :(


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщение
тут слегка сложнее
ээээ... кагбэ.... а у меня разве не так? :(

Автор - ikki
Дата добавления - 15.09.2014 в 11:18
Alex_100 Дата: Понедельник, 15.09.2014, 14:01 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Ребята, всем большое спасибо за помощь!
Чуть позже выложу код, который предложили на других форумах, может кому то будет полезным.
Еще раз спасибо!
 
Ответить
СообщениеРебята, всем большое спасибо за помощь!
Чуть позже выложу код, который предложили на других форумах, может кому то будет полезным.
Еще раз спасибо!

Автор - Alex_100
Дата добавления - 15.09.2014 в 14:01
SkyPro Дата: Понедельник, 15.09.2014, 14:56 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
на других форумах

Хорошим тоном считается сразу указывать ссылки на сайты, где вы задали такой же вопрос.


skypro1111@gmail.com
 
Ответить
Сообщение
на других форумах

Хорошим тоном считается сразу указывать ссылки на сайты, где вы задали такой же вопрос.

Автор - SkyPro
Дата добавления - 15.09.2014 в 14:56
ikki Дата: Вторник, 16.09.2014, 15:12 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
http://programmersforum.ru/showthread.php?t=265501
и тоже, как и здесь, обещание осталось обещанием :)


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениеhttp://programmersforum.ru/showthread.php?t=265501
и тоже, как и здесь, обещание осталось обещанием :)

Автор - ikki
Дата добавления - 16.09.2014 в 15:12
ShAM Дата: Вторник, 16.09.2014, 18:10 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1347
Репутация: 249 ±
Замечаний: 0% ±

Excel 2010
И не только там.
ЗЫ: Вчера специально искал на форумах, где решение отличается от данных здесь. Не нашел. :(
Не буду загромождать не нужными ссылками.
 
Ответить
СообщениеИ не только там.
ЗЫ: Вчера специально искал на форумах, где решение отличается от данных здесь. Не нашел. :(
Не буду загромождать не нужными ссылками.

Автор - ShAM
Дата добавления - 16.09.2014 в 18:10
SLAVICK Дата: Среда, 17.09.2014, 00:39 | Сообщение № 10
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Поиском уже совсем не пользуются... deal
буквально недавно обсуждали тему как генерировать перестановки? - были и формульные решения и UDF...

Здесь в коде МСН использован макрос для генерации перестановок до 12!

Даже в готовых решениях есть

в общем есть из чего выбрать. hands
Вложил пример из готовых решений от МСН. :D
К сообщению приложен файл: 4941922.xls (34.5 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Среда, 17.09.2014, 00:59
 
Ответить
СообщениеПоиском уже совсем не пользуются... deal
буквально недавно обсуждали тему как генерировать перестановки? - были и формульные решения и UDF...

Здесь в коде МСН использован макрос для генерации перестановок до 12!

Даже в готовых решениях есть

в общем есть из чего выбрать. hands
Вложил пример из готовых решений от МСН. :D

Автор - SLAVICK
Дата добавления - 17.09.2014 в 00:39
SLAVICK Дата: Среда, 17.09.2014, 01:49 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
немного упустил из вида один момент - что нужна не комбинация а простой перебор :'(
Где - то вроде видел такой код... когда искал что мне нужно.
Если найду - скину :D


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщениенемного упустил из вида один момент - что нужна не комбинация а простой перебор :'(
Где - то вроде видел такой код... когда искал что мне нужно.
Если найду - скину :D

Автор - SLAVICK
Дата добавления - 17.09.2014 в 01:49
MCH Дата: Среда, 17.09.2014, 08:28 | Сообщение № 12
Группа: Админы
Ранг: Старожил
Сообщений: 2008
Репутация: 752 ±
Замечаний: ±

А если чисел не 4 а больше или меньше? Обычными вложенными циклами не обойдешься.
Вариант перебора чисел, по предложенной схеме на базе алгоритма генерации сочетаний
К сообщению приложен файл: _--.xlsm (16.7 Kb)
 
Ответить
СообщениеА если чисел не 4 а больше или меньше? Обычными вложенными циклами не обойдешься.
Вариант перебора чисел, по предложенной схеме на базе алгоритма генерации сочетаний

Автор - MCH
Дата добавления - 17.09.2014 в 08:28
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!