输出输入的所有因素

问题描述

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

例如:如果输入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算法,可以提高效率。