Страница: 1 | 2 |
Вопрос: Перестановки
Добавлено: 09.04.07 14:05
Автор вопроса: Meteor
Помогите!!!!
Каким образом из m чисел вывести на экран по n чисел всевозможными способами, например, есть 3 числа(3,4,7) вывести по 2:
34, 37, 47
Спасибо.
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #1
Добавлено: 09.04.07 16:55
____ Пусть есть массив A(1 to 100).
____ Тогда все перестановки из этого массива по два числа можно вывести следующим образом:
For j=i+1 To 100
Msgbox A(i) & A(j)
Next
Next
____ Для трёх — ещё один вложенный цикл.
____ Или надо общий случай для n?
Номер ответа: 2
Автор ответа:
Meteor
Вопросов: 2
Ответов: 6
Профиль | | #2
Добавлено: 09.04.07 19:34
смысл как раз в том что для n? для заранее неизвестного n
Номер ответа: 3
Автор ответа:
Meteor
Вопросов: 2
Ответов: 6
Профиль | | #3
Добавлено: 09.04.07 21:27
может как нибудь рекурсию использовать?
Номер ответа: 4
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #4
Добавлено: 10.04.07 02:47
34, 37, 47
33
44
77
34
37
47
43
74
73
уточняй задание
Номер ответа: 5
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #5
Добавлено: 10.04.07 12:54
1. Как стоят числа? (через запятую, через пробел, просто друг за другом или ещё как).
2. Откуда берутся числа? (вводит пользователь, из строки документа и т.д.).
Идея можно объединить все числа в одну строковую переменную а потом с помощью функиций типа Len, Left, Right и др. выполнить нужные действия без всяких циклов.
Номер ответа: 6
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #6
Добавлено: 10.04.07 19:27
капец
Номер ответа: 7
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #7
Добавлено: 10.04.07 20:43
Вообще-то это сочетания, а не перестановки
Номер ответа: 8
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #8
Добавлено: 11.04.07 18:39
Вообще-то этот вопрос наверное больше относится к математике. Но кажется придумал. Попробую использовать вложенные циклы. Общее число полученных значений равно m^n. На бумаге уже пробовал - получилось. Получается таблица из n столбцов и n^m строк.
Номер ответа: 9
Автор ответа:
Meteor
Вопросов: 2
Ответов: 6
Профиль | | #9
Добавлено: 11.04.07 20:59
а как это реализовтать с циклами если заранее неизвестно чему равно m и n.
числа содержаться в массиве
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 11.04.07 21:40
Рекурсивно, например
Номер ответа: 11
Автор ответа:
Meteor
Вопросов: 2
Ответов: 6
Профиль | | #11
Добавлено: 12.04.07 11:00
проблема как раз в том чтобы написать рекурсию
Номер ответа: 12
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #12
Добавлено: 12.04.07 11:18
____ Напрашивается интуитивно рекурсия, но на самом деле, если её и реализовать, то это будет всего лишь красивое решение. Проще просто написать цикл по формированию и выполнению "n" вложенных циклов. Я вижу как, но пока время не уделить.
Номер ответа: 13
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #13
Добавлено: 12.04.07 15:28
Рекурсия была бы интересна кончено...
Но вот что у меня получилось (для Excel-решения):
(Запускать лучше при активном чистом листе, т.к. все существующие при запуске данные с листа удаляются.)
Dim mas() As Integer, cnt() As Integer, v As Variant, dm As Integer, lc As Integer, i As Integer
v = Application.InputBox(Prompt:="Размерность массива?", Type:=1)
If v = False Then Exit Sub
dm = CInt(v)
v = Application.InputBox(Prompt:="Сколько чисел в комбинации?", Type:=1)
If v = False Then Exit Sub
lc = CInt(v)
If dm ^ lc > 65536 Then
MsgBox "слишком много комбинаций: " & dm ^ lc
Exit Sub
End If
ReDim mas(1 To dm)
ReDim cnt(1 To lc)
'заполнение случайными целыми от 10 до 99
For i = 1 To dm
mas(i) = Int(Rnd((Now())) * 89) + 10
Next i
For i = 1 To lc
cnt(i) = 1
Next i
l = lc
ActiveSheet.UsedRange.Cells.ClearContents
Do
res = ""
For i = 1 To lc
res = res & " " & mas(cnt(i))
Next i
'Очередная комбинация
Cells(WorksheetFunction.CountA(Columns(1)) + 1, 1).Value = LTrim(res)
Do While l > 0
cnt(l) = cnt(l) + 1
If cnt(l) > dm Then
cnt(l) = 1
l = l - 1
Else
l = lc
Exit Do
End If
Loop
Loop While l > 0
Columns(1).AutoFit
End Sub
Номер ответа: 14
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #14
Добавлено: 12.04.07 17:31
а как это реализовтать с циклами если заранее неизвестно чему равно m и n.
числа содержаться в массиве
Т.к. получается таблица, то надо использовать только 2 цикла (один будет вложен в другой). Один цикл будет заполнять строки до n символов длиной, а другой будет из этих строк формировать таблицу до m^n строк.
65536-это слишком мало комбинаций. Лучше Long.
Номер ответа: 15
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #15
Добавлено: 12.04.07 18:17
А все и сделано так, что заранее неизвесно... в первой половине происходит образование массива и его заполненеие случайными целыми, а собственно решение начинается со строки
Далее, уж Вы как-то сами должны... хорошо? Ну, там пальцем о палец ударить, что ли...
(а 65536 - это только ограничение листа Excel (до ХР) - можете это изменять, как Вам хочется...
Оспаривать авторские права не собираюсь... но если Вы будете настаивать, то может быть и изменю это свое намерение.