我正在尝试创建一个LMC汇编代码,它将允许用户输入两个输入:十进制数和数字应转换为的基数。代码应该能够将任何十进制数转换为包括2和9之间的任何基数。
我知道除法在LMC上是不可用的:我可以使用减法。比方说,从12位小数到基数3,我可以得到12-3-3-3-3= 4,但是我如何让代码理解除法的其余部分12/3= 4,除法的其余部分是0和4-3=1,但4/3=1,...除法的其余部分是1-3=-2,1/3是0,33...所以剩下的是1,现在以相反的方式读出,12十进制到基数2是110。
但同样,即使是1-3= -2:我如何才能让它理解其余的是1?
另外,我如何才能让代码理解它在哪个库中?我要先创建一个很长的代码来检测碱基吗?假设它是BRA,取决于它是哪个基,那么我甚至不确定它是否对所有基都是相同的算法……
我在这里有点困惑,但即使有人能帮助我理解如何编写代码来获得除法的剩余部分,这也会对我有很大帮助。
发布于 2019-11-25 04:03:52
我假设输出应该是一系列以给定基数表示给定十进制数的单位数。
你可以使用基于数据的方法:存储所有相关的2,3,4,...内存(邮箱)中有9个。我们只需要不大于999的功率,所以这个列表是有限的:
基本版7: 1 7 49 343基本版8: 1 8 64 512
基本版9: 1 9 81 729这也有一个好处,那就是你不需要执行那么多的减法。想象一下当输入是999和基数2时的不同之处。如果你已经有了2的幂(最多512),你只会做9次减法,而如果你只用2做减法,你会做数百次减法……
因此,给定这些幂,在列表中使用一个“指针”(通过自修改代码),它将首先找到属于给定基数幂的范围,然后从那里获取它,从原始数字中重复减去一个幂(最大的第一个),以确定每个输出数字。
只要小心一点,只要没有人输出,您就可以避免输出零。
这是如何编码的:
#input: 12 2
INP // number
STA DECIMAL
INP // base
SUB ONE
STA BASE
LOOPBASE LDA BASE // count down to find powers of base
SUB ONE
STA BASE
BRZ DIVIDE
LOOPPOW LDA CODE1 // take next power
ADD ONE
STA CODE1 // self-modifying
LDA ONE // is it 1?
CODE1 SUB POWER
BRZ LOOPBASE // yes...
BRA LOOPPOW // no...
DIVIDE LDA CODE1
ADD ONE
STA CODE2
BRA ENTRY
LOOP STA DECIMAL
LDA DIGIT
ADD ONE
STA DIGIT
ENTRY LDA DECIMAL
CODE2 SUB POWER
BRP LOOP
LDA FIRST // do not output prepadded 0
BRZ OUTPUT // not the first digit
LDA DIGIT
BRZ SKIP
OUTPUT LDA DIGIT
OUT
SUB DIGIT
STA FIRST // no longer first digit
SKIP STA DIGIT
LDA CODE2
ADD ONE
STA CODE2 // self-modifying
STA CODE3 // self-modifying
LDA ONE // is power 1?
CODE3 SUB POWER
BRP FINISH // yes
BRA ENTRY
FINISH LDA DECIMAL
OUT
HLT
DECIMAL DAT
BASE DAT
DIGIT DAT
FIRST DAT 1
POWER DAT
DAT 512 // powers of 2
DAT 256
DAT 128
DAT 64
DAT 32
DAT 16
DAT 8
DAT 4
TWO DAT 2
ONE DAT 1
DAT 729 // powers of 3
DAT 243
DAT 81
DAT 27
DAT 9
DAT 3
DAT 1
DAT 256 // powers of 4
DAT 64
DAT 16
DAT 4
DAT 1
DAT 625 // powers of 5
DAT 125
DAT 25
DAT 5
DAT 1
DAT 216 // powers of 6
DAT 36
DAT 6
DAT 1
DAT 343 // powers of 7
DAT 49
DAT 7
DAT 1
DAT 512 // powers of 8
DAT 64
DAT 8
DAT 1
DAT 729 // powers of 9
DAT 81
DAT 9
DAT 1
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.7/lmc.js"></script>
这几乎使用了所有可用的邮箱。也许在空间使用上的一些优化仍然是可能的。
https://stackoverflow.com/questions/55409767
复制相似问题