C++ 在进行顺序计算时保持操作顺序
我晚上在Kattis做一些编程问题。这个问题有一部分是我一直坚持的 给定一个数字,程序应该返回实现该数字所需的四个操作(+、-、*或/) 例如,输入C++ 在进行顺序计算时保持操作顺序,c++,operators,C++,Operators,我晚上在Kattis做一些编程问题。这个问题有一部分是我一直坚持的 给定一个数字,程序应该返回实现该数字所需的四个操作(+、-、*或/) 例如,输入 9 将导致输出 4 + 4 + 4 / 4 = 9 我的解决方案(不是很有效,但很简单)是评估所有可能的方法来组合上面的操作符,看看是否有任何组合达到了想要的结果 为此,我编写了如下所示的函数。它接受一个字符数组,这些字符是要计算的运算符(uo[3],可能看起来像{+,/,*}),所需的结果是一个整数(expRes) 我意识到这种“顺序”方法会
9
将导致输出
4 + 4 + 4 / 4 = 9
我的解决方案(不是很有效,但很简单)是评估所有可能的方法来组合上面的操作符,看看是否有任何组合达到了想要的结果
为此,我编写了如下所示的函数。它接受一个字符数组,这些字符是要计算的运算符(uo[3]
,可能看起来像{+,/,*}
),所需的结果是一个整数(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是运算符的数目。将这些解决方案的答案作为
对保留,以便查找测试用例的输入是O(1)
按部就班你会做的
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;
}
// 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
}
}