在进行顺序计算时保持操作顺序

Keeping the order of operations while doing a sequential calculation

本文关键字:顺序 操作 计算      更新时间:2023-10-16

我晚上正在做Kattis的一些编程问题。问题 4 的一部分认为我坚持了下来。

给定一个数字,程序应该返回实现该数字所需的运算(+,-,*或/(,介于4个四之间。

例如,输入

9

将导致输出

4 + 4 + 4 / 4 = 9

我的解决方案(效率不高,但很简单(是评估组合上述运算符的所有可能方法,看看是否有任何组合达到了预期的结果。

为此,我编写了如下所示的函数。它接受一个字符数组,这些字符是要计算的运算符(uo[3],可能看起来像{+, /, *}(,以及整数(expRes(所需的结果。

bool check(char uo[3], int expRes) {
int res = 4;
for(int oPos = 2; oPos >= 0; oPos--) {
switch (uo[oPos]) {
case '+' : res += 4; break;
case '-' : res -= 4; break;
case '*' : res *= 4; break;
case '/' : res /= 4; break;
}
}
return res == expRes;    
}

我意识到这种"顺序"方法带来了一个问题:它不遵循操作顺序。如果我要调用该函数uo = {+, -, /}expRes = 7它会返回 false,因为 4 + 4 = 8, 8 - 4 = 4, 4/4 = 1。 真正的答案显然是正确的,因为 4 + 4 - 4/4 = 7。

你们中有人能想到一种方法来重写函数,以便计算遵循操作顺序吗?

提前感谢!

如果你看一下,这是一个简单的问题。

您被限制为四个 4 和三个运算符,也就是说您已经知道您的搜索空间。因此,一种解决方案是生成完整的搜索空间,即 O(n^3( = 4^3 = 64 个总方程,其中 n 是运算符的数量。将这些解决方案的答案保留为<key, value>对,以便查找测试用例的输入为 O(1(。

一步一步地做。

  1. 生成完整序列并将其存储为键、值对
  2. 从测试用例中获取输入
  3. 检查键是否存在,如果是,则打印序列,否则打印序列不存在
  4. 解决方案将需要 64*1000 次操作,这可以在一秒钟内轻松计算,并且可以避免通常这些比赛具有的时间限制超出错误

在代码形式中(其中大部分不完整(:

// C++ Syntax
map<int, string> mp;
void generateAll() {
// generate all equations
}
void main () {
generateAll();
int n, t; scanf("%d", &t);
while (t--) {
scanf("%d", &n);
if ( mp.find(n) != mp.end() ) 
// equation exists to the input
else
// equation doesn't exist for the input
}
}