|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Eugene Anuchin 2:5070/96.2 21 Jul 2002 01:30:04 To : Dmitriy Gerasimenko Subject : Перебор чисел -------------------------------------------------------------------------------- 19 Июл 02 14:19, Dmitriy Gerasimenko wrote to All: DG> И спросил у меня радиотехник: "....нужно код разгадать у DG> магнитолки.... цифери я узнал, нужно сделать перебор." Спрошено - DG> сделано, причём с удовольствием. Код 4-ёх значный = 2514. N= DG> 4 Вложенные циклы отпадают, т.к. чем больше N тем больше DG> гемор.... DG> Привожу код на С (Borlabd C++ 3.1 for DOS), который возможно и лучше DG> можно было сделать, а ? или нельзя ? Я использовал рекурсию, программа находит все перестановки произвольной строки символов. Предполагается что все символы различны. Компилировалось fasm'ом. http://fasm.metro-nt.pl/fasm.zip (~200kb). Imho, получился довольно изящный и короткий (53 байта) алгориитм... Для строки '0123456789' выдает честных 3628800 перестановок менее чем за секунду (ессно без вывода на консоль). фича: после последней перестановки строка принимает первоначальный вид, как до перестановок. org 100h xor ch,ch ;обнуляем старший байт счетчика mov bl,cnt ;кол-во символов mov dx,buf ;начало строки mov ah,9 ;печать в stdout int 21h ;---------------------- recur: mov bh,bl ;выполняем bh <- bl раз основной цикл dec bl ;выполняем (bl-1) раз подпрограмму next: cmp bl,1 ;проверка концевика jna konec ;если <=1, то перестаем вызывать подпрограмму push bx ;иначе сохраняем оба счетчика call recur ;вызываем подпрограмму pop bx ;восстанавливаем оба счетчика konec: mov cl,bl ;кол-во символов для сдвига mov di,dx ;адрес приемника mov si,dx ;адрес источника (след.символ) inc si mov al,[di] ;сохраняем младший символ, который щаз затрется rep movsb ;сдвигаем 'сх' символов в младшие адреса stosb ;сохраненный младший символ пишем в старший адрес dec bh ;уменьшаем счетчик кол-ва проходов jnz print ret ;если ноль, то выход из подпрограммы print: int 21h jmp next ;следующий проход ;----------------------------- buf db 'abcd' ;массив. вместо 'abcd' подставь '2514' cnt = $-buf ;количество элементов db 13,10,'$' ... Life - Sucks! --- Hе подохнешь - пpивыкнешь, не пpивыкнешь - подохнешь! (М. Жванецкий) * Origin: `Wireless' Евгений ael @irk. ru (2:5070/96.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/27953d399846.html, оценка из 5, голосов 10
|