【问题标题】:ACM programming - Arithmetica 1.0 - any additional operators?ACM 编程 - Arithmetica 1.0 - 任何其他运算符?
【发布时间】:2026-02-09 21:45:01
【问题描述】:

本论坛中是否有人尝试解决 ACM 编程问题http://acm.mipt.ru/judge/problems.pl?browse=yes&problem=024?这是 ACM MIPT 中较简单的问题之一,目标是评估由 +、-、* 和括号组成的表达式。尽管看起来很简单,但我无法让我的解决方案被接受,显然,因为其中一个测试用例表达式有一个未在问题中说明的运算符。我什至添加了对除法 ('/') 的支持,但这也无济于事。关于需要支持哪些其他运营商的任何想法?仅供参考,我的程序会在处理之前从输入中删除所有空格,这样空格就不会成为问题。问题中没有说明但需要注意的事项?

【问题讨论】:

  • “显然”?你是怎么得出这个结论的?你支持一元减号吗?
  • 你是怎么处理的?我怀疑这并不像看起来那么简单 - 运算符的评估顺序以及维护堆栈并不是微不足道的(尽管也不是非常困难)
  • @phant0m - 是的,我支持一元减号 - 我使用您自己的示例表达式并使用问题陈述中给出的示例对其进行了验证。我添加了一行验证来检查我没想到的运算符 - 使用该行,我得到了解决方案的运行时错误。删除该行后,我得到了错误的答案(猜测是因为如果运算符不是 +、- 或 * 之一,我的代码默认为 '/' 运算符)
  • @amit - 是的,我使用了堆栈方法 - 每个堆栈用于运算符,1 个用于操作数。在评估表达式之前,我最初会识别一元减号并将它们转换为自定义运算符“~”。
  • @so1:请在您的答案(使用编辑选项)中提供您的解决方案的简短说明(可选地使用代码本身),很可能有一些您没有想到的极端情况 -我们将能够帮助您找到它。

标签: ruby algorithm arithmetic-expressions


【解决方案1】:

你被 ruby​​ 对字符串和字符的处理方式所困扰。

curr_ch = @input[i]

给你一个整数,对于你得到的输入,输入的索引i处的字符的ASCII码。

curr_ch == '('

例如将该整数与字符串"(" 进行比较,当然会失败。此外,正则表达式匹配失败,因为您将一个整数传递给它们,其中需要一个字符串。

some_var = @input[some_index...some_index+1] 替换所有出现的some_var = @input[some_index] 给了我一个似乎工作的程序(它适用于我给它的一些测试输入)。可能真正了解红宝石怪癖的人可以为您提供更好的解决方案。

【讨论】:

  • 非常感谢 - 结果证明是正确的!我完全错过了这样一个事实,即旧版本的 Ruby,例如比赛网站使用的那个,返回 ASCII 代码而不是 string[index] 的实际字符。我在本地使用较新版本的 Ruby 进行测试,因此无法发现问题。再次感谢!
  • 啊,好消息,它变得理智了。不过,我认为向后兼容性很糟糕。