AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77009397
Accepted
orbitalv
orbitalv
Asked: 2023-08-30 23:22:05 +0800 CST2023-08-30 23:22:05 +0800 CST 2023-08-30 23:22:05 +0800 CST

编写 LMC 程序来计算用户输入的数字之和。停止前显示总和

  • 772

我正在尝试解决这个代码挑战:

编写一个 LMC 程序来计算用户提供的数字的总和。在停止程序之前将总和显示为输出。如果用户提供的输入值少于或等于十个,则仅对偶数求和。奇数将被忽略。如果用户提供了十个以上的值,则仅对第十个输入之后的所有奇数求和。现有的偶数总和应保留。如果用户在任何时候输入零,则会显示总和。

例如:

输入值:3, 3, 4, 0
结果:4

输入值:2、3、7、0
结果:2

输入值:1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,0 结果:
43

在这里,您可以看到我的程序使用第一个示例的输入运行,它显示输出为 0(而不是预期的 4):

在此输入图像描述

我不确定代码有什么问题会给出错误的输出。我的错误在哪里?

代码:

start
             INP
             STA input
             BRZ halt
             LDA inputCounter

             SUB ten
             BRP afterTen

// Input <= 10
             LDA input
             STA isEven
             SUB one
             BRP oddNumber
             LDA isEven
             ADD one

             STA isEven
             SUB two
             BRZ evenNumber
oddNumber    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 isEven
             SUB one
             BRP evenAfterTen
             LDA isEven
             ADD one
             STA isEven
             SUB two
             BRZ oddAfterTen
evenAfterTen LDA inputCounter
             ADD one
             STA inputCounter
             BRA start

oddAfterTen  LDA input
             ADD oddSum
             STA oddSum
             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
isEven       DAT 0
input        DAT 0
// Constants
one          DAT 1
two          DAT 2
ten          DAT 10
algorithm
  • 1 1 个回答
  • 48 Views

1 个回答

  • Voted
  1. Best Answer
    trincot
    2023-08-31T01:33:48+08:002023-08-31T01:33:48+08:00

    问题出在检查数字是否为偶数的部分。该代码首先会减1,如果该指令没有导致负数溢出,则得出该数字是奇数的结论!这显然不(总是)正确。例如,如果您从 2 开始,那么它会错误地得出奇数的结论。

    要测试一个数字是否为奇数,您需要(在 LMC 的限制下)一个循环,在其中重复减去数字 2,直到达到零或出现负溢出。

    由于您的代码后半部分有类似的代码,因此该问题也在那里重复出现。

    这是一个更正:

    #input: 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 0
    start        INP
                 STA input
                 BRZ halt
                 LDA inputCounter
    
                 SUB ten
                 BRP afterTen
    
    // First ten inputs:
                 LDA input
    repeat1      STA isEven
                 SUB two        # subtract 2
                 BRP continue   
                 BRA oddNumber  # negative overflow! => result was -1, input is odd
    continue     BRZ evenNumber # zero => input is even
                 BRA repeat1    # neither: continue to subtract 2...
    
    evenNumber   LDA input
                 ADD evenSum
                 STA evenSum
    oddNumber    LDA inputCounter
                 ADD one
                 STA inputCounter
                 BRA start
    
    // From 10th input onwards:
    afterTen     LDA input
    repeat2      STA isEven
                 SUB two
                 BRP continue2
                 BRA oddAfterTen
    continue2    BRZ evenAfterTen
                 BRA repeat2
    oddAfterTen  LDA input
                 ADD oddSum
                 STA oddSum
    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
    isEven       DAT 0
    input        DAT 0
    // Constants
    one          DAT 1
    two          DAT 2
    ten          DAT 10
    
    
    <script src="https://cdn.jsdelivr.net/gh/trincot/[email protected]/lmc.js"></script>

    评论

    1. 不需要单独的evenSum和oddSum。您只需添加到相同的sum.

    2. 有一些代码重复:两段代码执行奇/偶测试。您可以通过isEven在处理前十个之后的输入时添加 1 来避免这种重复,然后您可以使用相同的代码来执行奇/偶测试,因为通过添加 1 可以反转结果。

    3. 由于小人计算机具有重置功能,该功能会重新启动程序而不将邮箱内容重置为其原始值(包括DAT),因此您将得到不一致的输出,特别是evenSum和oddSum“变量”将不会被重置。为了避免这种情况,请在程序一开始添加指令以将总和设置为零。

    以下是经过这些改进的代码:

    #input: 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 0
                 LDA zero
                 STA sum   # To avoid problems after LMC-reset
    start        INP
                 STA input
                 BRZ halt
                 LDA inputCounter
    
                 SUB ten
                 BRP afterTen
                 
                 LDA input
                 BRA testeven
                 
    afterTen     LDA input
                 ADD one  # By adding one, we inverse the odd/even test
    
    testeven     STA isEven
                 SUB two        # subtract 2
                 BRP continue   
                 BRA oddNumber  # negative overflow! => result was -1, input is odd
    continue     BRZ evenNumber # zero => input is even
                 BRA testeven   # neither: continue to subtract 2...
    
    evenNumber   LDA input
                 ADD sum
                 STA sum
    oddNumber    LDA inputCounter
                 ADD one
                 STA inputCounter
                 BRA start
    
    // Display sum
    halt         LDA sum
                 OUT
                 HLT
    // Variables
    sum          DAT 0
    inputCounter DAT 0
    isEven       DAT 0
    input        DAT 0
    // Constants
    zero         DAT 0
    one          DAT 1
    two          DAT 2
    ten          DAT 10
    
    
    <script src="https://cdn.jsdelivr.net/gh/trincot/[email protected]/lmc.js"></script>

    • -1

相关问题

  • 如何确定3个水壶问题中的可达状态?

  • 查找从 l 到 r 中按位与等于 0 的自然数对的数量

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve