LMC求和程序错误排查:输入偶数未计入求和问题
问题分析与解决方案
你的代码核心问题在于奇数/偶数的判断逻辑完全错误,导致所有正输入都被判定为奇数,偶数分支从未执行,最终求和结果错误。
错误原因详解
看你输入≤10分支的这段代码:
LDA input STA isEven SUB one BRP oddNumber
这段逻辑的意思是:输入值减1后,如果结果≥0(即输入≥1),就跳转到oddNumber分支。但所有正整数输入(比如4、2这些偶数)都满足输入≥1,因此都会被错误判定为奇数,直接跳走,根本没机会执行后续的偶数判断逻辑。这就是为什么输入4时,程序没有将其加入evenSum的原因。
修正方案
需要重新实现正确的偶数判断逻辑。在LMC中没有模运算,我们可以通过循环减2的方式判断:如果一个数减2直到结果小于2,最终结果为0则是偶数,为1则是奇数。
以下是修正后的完整代码:
start INP STA input BRZ halt LDA inputCounter SUB ten BRP afterTen // Input <= 10:仅累加偶数 LDA input STA temp // 保存输入值到临时变量,避免判断时修改原输入 check_even: SUB two BRZ evenNumber // 减2后为0,说明是偶数 BRP check_even // 结果仍为正,继续减2 // 减2后结果为负,说明是奇数,直接更新计数器回到循环 LDA inputCounter ADD one STA inputCounter BRA start evenNumber LDA input ADD evenSum STA evenSum LDA inputCounter ADD one STA inputCounter BRA start // Input > 10:累加前十项偶数后,累加后续奇数 afterTen LDA input STA temp check_odd: SUB two BRZ evenAfterTen // 减2后为0,是偶数,跳过 BRP check_odd // 结果仍为正,继续减2 // 减2后结果为负,说明是奇数,累加到oddSum LDA input ADD oddSum STA oddSum LDA inputCounter ADD one STA inputCounter BRA start evenAfterTen LDA inputCounter ADD one STA inputCounter BRA start // Display sum halt LDA evenSum ADD oddSum OUT HLT // Variables evenSum DAT 0 oddSum DAT 0 inputCounter DAT 0 input DAT 0 temp DAT 0 // 新增临时变量用于判断奇偶 // Constants two DAT 2 ten DAT 10
修正说明
- 新增临时变量
temp:用于在判断奇偶时保存原输入值,避免累加器修改原输入影响后续求和。 - 正确的奇偶判断逻辑:
- 对于输入≤10的分支:循环减2,若最终结果为0则判定为偶数,加入
evenSum;否则判定为奇数,直接跳过。 - 对于输入>10的分支:同样循环减2,若最终结果为1(即减2后为负)则判定为奇数,加入
oddSum;偶数直接跳过。
- 对于输入≤10的分支:循环减2,若最终结果为0则判定为偶数,加入
- 移除冗余变量:原代码中的
one和isEven变量已无需使用,直接删除简化代码。
测试第一个示例输入3,3,4,0时,程序会正确将4判定为偶数并加入evenSum,最终输出4,符合预期。
内容的提问来源于stack exchange,提问作者orbitalv
相关产品推荐
相关产品推荐

