Перебор чисел

From
Eugene Anuchin (2:5070/96.2)
To
Dmitriy Gerasimenko
Date
2002-07-23T03:03:31Z
Area
RU.ALGORITHMS
Hi, Dmitriy !

 22 Июл 02 09:08, Dmitriy Gerasimenko wrote to Eugene Anuchin:

 EA>> Компилировалось fasm'ом.
 EA>> http://fasm.metro-nt.pl/fasm.zip (~200kb). Imho, получился
 EA>> довольно изящный и короткий (53 байта) алгориитм...
 EA>> Для строки '0123456789' выдает честных 3628800
 EA>> перестановок менее чем за секунду (ессно без вывода на консоль)
 DG> А почему 3628800 ?
Количество ПЕРЕСТАНОВОК для десяти элементов = 10! (факториал)

 DG> Твой алгоритм перебора сгенерирует строку "0000000000","1111111111"?
Нет конечно. Только исходные элементы, переставленные всеми возможными вариантами.
 DG> Я бы и сам проверил, но у тебя нет вывода на консоль или в файл.
Как это нет?!!! Печать идет на стандартное устройство вывода (по умолчанию - консоль). Можно перенаправить в файл (перестановки.com > отчет.txt)

 DG> У меня подозрения, что твой алгоритм  не разрешает размножаться
 DG> символам в исходной строке, то есть он другой. Мой алгоритм похож на
 DG> электросчётчик, или на спидометр в автомобиле если угодно.
 DG> Соответсвенно, по моёй формуле количество перестановок твоего числа =
 DG> 10^10
А какой тогда здесь вообще алгоритм?!
Просто пробегаем все значения от 0 до 10^10-1 (0000000000-9999999999)

 DG> Приведу пример: исходная строка "1234", из N символов. N=4
 DG> Найти: все возможные перестановки шириной S символов, S= 1, 2, 3, 4,
 DG> 5, 6, 7. Количество перестановок= N^S
хорошо, вот то, что надо:

        org     100h
        push    word last
        mov     ah, 9
        mov     dx, string
        mov     di, dx
;------------------------------
recur:  mov     si, buffer
next:   lodsb
        mov     [di], al
        cmp     di, CR-1
        jae     skip
        push    si
        push    di
        inc     di
        call    recur
        pop     di
        pop     si
skip:   cmp     si, string
        jae     quit
        int     21h
        jmp     next
quit:   ret
;------------------------------
last:   int     21h
        ret
buffer  db '012345' ;исходные элементы, N=6 штук. Можно заменить на 'privet'
string  db 'xxx'    ;итоговая строка S=3 символа. N^S = 6^3 вариантов
CR      db ' $'


... Life - Sucks!
--- Не подохнешь - пpивыкнешь, не пpивыкнешь - подохнешь! (М. Жванецкий)
 * Origin: `Wireless' Евгений ael @irk. ru (2:5070/96.2)