Относительно компьютерного остатка человечка (модуля) делительных чисел
Напишите программу, которая просит пользователя ввести 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 // объявляем переменную