首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LMC:包含从十进制到基数9的基数转换

LMC:包含从十进制到基数9的基数转换
EN

Stack Overflow用户
提问于 2019-03-29 10:43:07
回答 1查看 412关注 0票数 2

我正在尝试创建一个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,取决于它是哪个基,那么我甚至不确定它是否对所有基都是相同的算法……

我在这里有点困惑,但即使有人能帮助我理解如何编写代码来获得除法的剩余部分,这也会对我有很大帮助。

EN

回答 1

Stack Overflow用户

发布于 2019-11-25 04:03:52

我假设输出应该是一系列以给定基数表示给定十进制数的单位数。

你可以使用基于数据的方法:存储所有相关的2,3,4,...内存(邮箱)中有9个。我们只需要不大于999的功率,所以这个列表是有限的:

  • 基本版2: 1 2 4 8 16 32 64 128 256 512
  • 基本版3: 1 3 9 27 81 243 729
  • 基本版4: 1 4 16 64 256
  • 基本版5: 1 5 25 125 625
  • 基本版6: 1 6 36 216

基本版7: 1 7 49 343基本版8: 1 8 64 512

  • 基本版9: 1 9 81 729

这也有一个好处,那就是你不需要执行那么多的减法。想象一下当输入是999和基数2时的不同之处。如果你已经有了2的幂(最多512),你只会做9次减法,而如果你只用2做减法,你会做数百次减法……

因此,给定这些幂,在列表中使用一个“指针”(通过自修改代码),它将首先找到属于给定基数幂的范围,然后从那里获取它,从原始数字中重复减去一个幂(最大的第一个),以确定每个输出数字。

只要小心一点,只要没有人输出,您就可以避免输出零。

这是如何编码的:

代码语言:javascript
复制
#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>

这几乎使用了所有可用的邮箱。也许在空间使用上的一些优化仍然是可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55409767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档