我在研究中需要帮助,如果数字是偶数,它可以显示 1,如果数字是奇数,它可以显示 0。例如,如果输入是 99,它将显示输出 1,这意味着奇数。如果我显示 10,它将显示输出 0,这意味着偶数。
我没有任何代码,因为我不知道如何开始。请帮忙。我只是这种东西的新手。
我在研究中需要帮助,如果数字是偶数,它可以显示 1,如果数字是奇数,它可以显示 0。例如,如果输入是 99,它将显示输出 1,这意味着奇数。如果我显示 10,它将显示输出 0,这意味着偶数。
我没有任何代码,因为我不知道如何开始。请帮忙。我只是这种东西的新手。
通过重复减法进行除法,可以区分奇数和偶数。
一般来说,一个数即使可以被 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 >= 2
为b - 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 两者都没有,甚至本身也不能处理二进制数,所以我们需要模拟除法。
玛格丽特的回答期望累加器在负标志由先前的减法 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>
嗯,好吧,让我想一想,没有AND
这个很棘手。在算法级别上,您似乎必须循环将输入数减一直到零,并进行result = 1 - result
每次迭代。最后,您的结果将是一或零(取决于result
(0
或1
,您决定) 的初始值,以及输入数字的奇数)。
现在你必须为 LMC 写这个,我现在不打算学习它。如果您完全迷路了,请阅读 wiki 页面,找到一些模拟器,在其中运行一些示例代码,并逐条研究它,它做了什么,试着找出原因。然后再尝试几个例子,看看它们是如何工作的,然后回到我写的算法,试着自己写。
(如果仍然迷路,你应该对每个点都有一个具体的问题,这将更容易回答,其中一些非常适合 SO .. 你原来的问题看起来有点过于宽泛和缺乏,我有点想知道你尚未被否决并“搁置”)。
编辑(为了好玩):
这r=r-1
是一种在只有减法之间0
和何时翻转的方式。1
通常 CPU 也有xor
指令not
使操作更简单(从按位汇编程序员的角度来看),但我倾向于在 Java 中使用 r=r-1 以便让我的同事更容易阅读,他们总是忘记什么是xor
和然后他们感到困惑r^=1
;