-4

我在研究中需要帮助,如果数字是偶数,它可以显示 1,如果数字是奇数,它可以显示 0。例如,如果输入是 99,它将显示输出 1,这意味着奇数。如果我显示 10,它将显示输出 0,这意味着偶数。

我没有任何代码,因为我不知道如何开始。请帮忙。我只是这种东西的新手。

4

3 回答 3

4

通过重复减法进行除法,可以区分奇数和偶数。
一般来说,一个数即使可以被 2 整除,或者用更实用的术语来说,如果除以 2 的其余部分为零1

要将b除以a我们可以简单地从b中减去a并重复直到新更新的b小于a。 我们循环的次数是数字b / a,留在b中的值是提醒b mod a。 我们对后者感兴趣,所以我们不会计算迭代次数。

Input b
While b >= 2 Do
   b = b - 2
End While

If b == 0 Then
   Output 1;
Else
   Output 0;
End If

不幸的是,LMC 没有立即指令的比较。
然而,这不是问题,因为我们可以重写b >= 2b - 2 >= 0更接近 LMC 可以做的事情。
但是b - 2在循环中是否完成了相同的计算,所以我们可以完全重用它

Input b
Do
   b = b - 2
Loop While b >= 0
b = b + 2

Output b

之所以b = b + 2需要,是因为在退出循环时 b 是负数,它要么是 -1(如果数字是奇数),要么是 -2(如果数字是偶数)。这就是我在循环条件中添加等号的原因。
通过添加 2,我们可以直接输出 b。


上面的算法计算你的问题的补码,它为偶数输出 0,为奇数输出 1。
我默默地添加了这个“扭曲”,这样愚蠢的复制粘贴会伤害你。

由于这是一项家庭作业,因此我将反转输出的任务留给您自己。

代码在下面,隐藏。
注意,此代码不能解决原始练习,使用它会使您获得零分。

INP                       ;ACC = Number from user
sub2_loop

  SUB two                 ;ACC = ACC - 2

BRP sub2_loop             ;If ACC >= 0, keep subtracting 2

 ;ACC < 0, since we were subtracting 2 ACC can only be -1 or -2

 ADD two                  ;Set ACC = 1 or 0

end
 OUT                      ;Show ACC
 HLT

 two DAT 2


1通常,程序员会利用以二为底的属性(即 2 0是 2 的唯一奇次幂),但这需要 AND 或 SHIFT 操作才能提取到最少的二进制数字。
LMC 两者都没有,甚至本身也不能处理二进制数,所以我们需要模拟除法。

于 2016-07-04T12:50:02.830 回答
1

玛格丽特的回答期望累加器在负标志由先前的减法 2 设置时具有确定的值。或者至少加 2 会使累加器恢复到以前的状态。

这在某些实现中可能是正确的,但不能保证。理论上,LMC 只处理非负数,负数的唯一概念是在“负”标志中。维基百科警告说,在减法导致负端溢出后,累加器的值未定义。

例如,在 LMC 的这种实现中,无论溢出的幅度如何,累加器都将设置为 -1,因此此时奇数和偶数之间的区别就消失了。许多人会认为这是一个非常奇怪的实现,但它符合 LMC 规范。

这是一个不做超出 LMC 规范的假设的版本:

#input: 9
       INP
  loop STA result
       SUB two
       BRP loop
       LDA result ; restore value from before subtraction
       OUT
       HLT
   two DAT 2
result DAT
  
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.7/lmc.js"></script>

于 2019-11-24T22:11:03.477 回答
-1

哇,那个东西没有AND
LMC 链接 1
LMC 维基

嗯,好吧,让我想一想,没有AND这个很棘手。在算法级别上,您似乎必须循环将输入数减一直到零,并进行result = 1 - result每次迭代。最后,您的结果将是一或零(取决于result(01,您决定) 的初始值,以及输入数字的奇数)。

现在你必须为 LMC 写这个,我现在不打算学习它。如果您完全迷路了,请阅读 wiki 页面,找到一些模拟器,在其中运行一些示例代码,并逐条研究它,它做了什么,试着找出原因。然后再尝试几个例子,看看它们是如何工作的,然后回到我写的算法,试着自己写。

(如果仍然迷路,你应该对每个点都有一个具体的问题,这将更容易回答,其中一些非常适合 SO .. 你原来的问题看起来有点过于宽泛和缺乏,我有点想知道你尚未被否决并“搁置”)。

编辑(为了好玩):
r=r-1是一种在只有减法之间0和何时翻转的方式。1通常 CPU 也有xor指令not使操作更简单(从按位汇编程序员的角度来看),但我倾向于在 Java 中使用 r=r-1 以便让我的同事更容易阅读,他们总是忘记什么是xor和然后他们感到困惑r^=1

于 2016-07-04T10:06:34.300 回答