输出输入的所有因子

Output all the factors of the input

我正在尝试输出将输入均分的每个数字(因此没有余数)。

例如:如果输入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,因此您可以立即输出它,并以除数 = 2 而不是 1 开始主循环。同样,一旦除数大于被除数的一半,您可以退出循环并输出股息本身,因为在 dividend/2 和股息之间没有其他除数。

通过实施 long division 算法可以提高效率。