Относительно компьютерного остатка человечка (модуля) делительных чисел

Напишите программу, которая просит пользователя ввести 2 цифры. Затем программа отображает на экране (OUT) результат взятия остатка (модуля) деления второго числа на первое число. Например, если первое введенное число было 14, а второе введенное число было 5, тогда программа отобразит 4.

14 мод 5 = 14 - (2 * 5) = 14 - 10 = 4

14 мод 7 = 14 - (2 * 7) = 14 - 14 = 0

Вы можете предположить, что введенные числа всегда положительны и больше 0.

Привет, это вопрос, я понятия не имею, как начать этот вопрос / сделать это?

3 ответа

Вы можете решить эту проблему, вычитая второе число из первого, пока не получите отрицательное число. Вот рабочая версия:

    INP
    STA R0
    INP
    STA R1
    LDA R0
L0  STA R0
    SUB R1
    BRP L0
    LDA R0
    OUT
    HLT
R0  DAT
R1  DAT

Вы можете увидеть это здесь: Работа по модулю на эмуляторе LMC.

Это просто простая арифметика - получить x = m MOD n вы можете сделать это:

x = m / n    ; integer division (truncates)
x = x * n    ; multiply back up to get exact multiple
x = m - x    ; subtract to get remainder (modulus)

Поскольку Little Man имеет только арифметические инструкции ADD и SUB, вам нужно реализовать операции умножения и деления из первых принципов.

INP STA FIRST INP STA SECOND LOOPTOP LDA FIRST SUB SECOND STA FIRST BRP LOOPTOP ADD SECOND BRA ENDLOOP OUT ENDLOOP HLT FIRST DAT SECOND DAT

это неэффективный способ решить эту проблему!! Я только что создал цикл, который вычитает вторую из первой переменной, пока она не станет отрицательной, затем я добавляю к ней вторую переменную

все основано на школьных знаниях

Здесь мы идем, вы должны решить эту проблему деления, используя метод вычитания... это работает именно ваша проблема, находя напоминание о делении двух чисел...

// ПРОИЗВЕДЕНО ДЖЕЙМСОМ ХАНАЛОМ

INP // спросить пользователя

BRZ QUIT // остановить выполнение, если введен ноль

STA DIVIDEND // сохранить в переменной дивиденда

INP // входной делитель

BRZ QUIT // остановить выполнение, если введен ноль

STA DIVIDOR // сохранить в переменной делителя

LDA DIVIDEND // загрузить в соотв.

LOOP STA RESULT // сохранить временный результат

LDA RESULT // загрузить результат

SUB DIVIDOR // вычитаем делитель в соотв.

BRP LOOP // цикл, если значение положительное или равно нулю

LDA RESULT // загрузить результат в соотв.

OUT // отобразить результат

QUIT HLT // остановка, если brz

HLT // Hlt казнь

DIVIDEND DAT // объявляем переменную

DIVISOR DAT // объявляем переменную

Другие вопросы по тегам