问题描述
我正在尝试输出将输入均分的每个数字(因此没有余数)。
例如:如果输入60,则输出应为:
1、2、3、4、5、6、10、12、15、20、30、60
在本示例中,我编写了输出10的代码:50 /5。但是我不知道如何修改它,以便获得所有因素。我将不胜感激!
IN
STO DIVID
IN
STO DIVIS
LOOP1 LDA count
ADD one
STO count
LDA DIVID
SUB DIVIS
STO DIVID
OUT DIVID
BRP LOOP1
HLT
DIVID DAT 000
DIVIS DAT 000
one DAT 001
count DAT 000
解决方法
您将需要一个额外的外部循环来管理DIVIS的值,将其值从1增加到DIVID。
这是在可运行代码段中的样子:
#input:60
LDA ONE
STO divisor
IN
BRZ invalid
STO dividend
next LDA dividend
loop BRZ output
STO remainder
LDA remainder
SUB divisor
BRP loop
BRA inc
output LDA divisor
OUT
inc LDA divisor
SUB dividend
BRP done
LDA divisor
ADD ONE
STO divisor
BRA next
invalid OUT ; zero
done HLT
ONE DAT 1 ; constant
divisor DAT
dividend DAT
remainder DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.74/lmc.js"></script>
如果输入为0,则此程序会将其视为“无效”,并输出0并暂停。
这是一个非常基本的算法,并未针对效率进行优化。可能有几种优化方法,这会使代码更长。例如,每个数字都有除数1,因此您可以立即将其输出,并以divisor = 2(而不是1)开始主循环。类似地,一旦除数大于被除数的一半,就可以退出循环并输出分红本身,因为在分红/ 2和分红之间找不到其他除数。
通过实现long division算法,可以提高效率。