Сообщение от
null_device
drbars, Вариантов несколько:
1 (быстрый, но требующий больше памяти). Завести два массива, размерность которого определяется максимально возможным числом. Далее, организуем цикл: извлекаем из первого массива (со "случайными" числами) первый элемент и значение из второго массива, "номер" которого является величина числа из первого массива. Если "флаг" наличия во втором массиве не установлен, устанавливаем его и переходим к следующему элементу первого массива. В противном случае "сдвигаем" все значения первого массива вниз на одну ячейку и уменьшаем "верхнее" значение счетчика цикла. После чего, повторяем проверку той же ячейки еще раз.
2 (медленный, не требующий второго массива). Организуем цикл. Извлекаем значение ячейки массива соответствующее параметру цикла. Сравниваем его со всеми числами от первой ячейки до текущей. Если они равны, смещаем элементы массива "вниз" на одну ячейку. Уменшаем верхний предел цикла. Повторяем сравнение.
Первый вариант быстрее, но требует памяти 256 байт. Во втором случае чуть медленее будет. Кстати если попадается ноль, сразу переход на следующий байт массива без проверки.
Но задачка в том, как изящно сделать этот второй вариант чтобы не дёргать стек.
---------- Post added at 16:28 ---------- Previous post was at 15:59 ----------
Может так? Как бы оптимизировать?)
Код:
ARRAY DB 1,3,9,7,5,9,4,3
TEST: DI
LD SP,#BFFF
LD B,#08
LD A,#01
LD (CNT2+1),A
LD DE,ARRAY+1
LOOP LD A,(DE)
EXX
LD HL,ARRAY
CNT2 LD BC,01
CPIR
EXX
CALL NZ,RESULT
INC DE
LD HL,CNT2+1
INC (HL)
DJNZ LOOP
JR $
RESULT OUT (#FE),A
RET