как отобразить все отчетливые 7-значные числа от 2 до 9? - PullRequest
0 голосов
/ 23 октября 2009

Я имею в виду, что все числа _ _ _ _ _ _ _ различны и могут быть введены только значения от 2 до 9. Я пытался использовать массив и циклы, но я просто не мог найти решение для отображения всех чисел. Примеры 7-значного числа от 2 до 9: 234567 234568 234569

324567 324568 324569

обратите внимание, что ни одно из чисел в этих значениях не повторяется. Я действительно понятия не имею, что происходит. пожалуйста, помогите мне!

Ответы [ 4 ]

1 голос
/ 23 октября 2009

Заимствовано из документов Python's itertools .

def permutations(iterable, r=None):
    # http://docs.python.org/library/itertools.html#itertools.permutations
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = range(n)
    cycles = range(n, n-r, -1)
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return
for number in permutations('23456789',6): # you said 7, but your examples were 6
    print number

Редактировать: Или, если у вас есть Python в любом случае ...

import itertools
for number in itertools.permutations('23456789',6): print number
1 голос
/ 23 октября 2009

Поскольку это звучит подозрительно, как домашняя работа, обучение здесь будет постепенным. Сначала попробуйте грубую силу. Вот алгоритм (ну, действительно, Python), который сделает это:

for n1 in range(2,10):
  for n2 in range(2,10):
    if n2 != n1:
      for n3 in range(2,10):
        if n3 != n2 and n3 != n1:
          for n4 in range(2,10):
            if n4 != n3 and n4 != n2 and n4 != n1:
              for n5 in range(2,10):
                if n5 != n4 and n5 != n3 and n5 != n2 and n5 != n1:
                  for n6 in range(2,10):
                    if n6 != n5 and n6 != n4 and n6 != n3 and n6 != n2 and n6 != n1:
                      for n7 in range(2,10):
                        if n7 != n6 and n7 != n5 and n7 != n4 and n7 != n3 and n7 != n2 and n7 != n1:
                          print "%d%d%d%d%d%d%d"%(n1,n2,n3,n4,n5,n6,n7)

Это в основном семь вложенных циклов, по одному на каждую позицию цифры, с проверками на отсутствие дубликатов в любой точке. Обратите внимание, что это не решение, которое будет хорошо масштабироваться для лотов позиций цифр, но оно хорошо работает для семи из них. Если вам нужно гораздо больше, лучше использовать менее грубое решение.

1 голос
/ 23 октября 2009

Существует 7! = 5040 способов перестановки abcdefg.

Существует 9 C 7 = 36 способов выбора 7 номеров из 123456789.

Учитывая перестановку "bfgdeac" и набор {1,3,4,5,6,8,9}, существует естественный способ использовать перестановку для обеспечения порядка для набора, т.е. [3, 8,9,5,6,1,4].

1 голос
/ 23 октября 2009

Поскольку вы не указали язык, вот ответ на Haskell.

import Control.Monad

selectPerms :: MonadPlus m => [a] -> Int -> m [a]
selectPerms _        0 = return []
selectPerms universe n = do
    (digit, remain) <- selectDigit universe
    xs <- selectPerms remain (n - 1)
    return (digit:xs)

selectDigit :: MonadPlus m => [a] -> m (a, [a])
selectDigit [] = mzero
selectDigit (x:xs) = capture `mplus` next
    where
        capture = return (x, xs)
        next = do
            (digit, remain) <- selectDigit xs
            return (digit, x:remain)

yourAnswer :: [[Int]]
yourAnswer = selectPerms [2..9] 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...