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

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

我晚上在Kattis做一些编程问题。这个问题有一部分是我一直坚持的

给定一个数字,程序应该返回实现该数字所需的四个操作(+、-、*或/)

例如,输入

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)

按部就班你会做的

  • 生成完整序列并将其存储为键、值对
  • 从测试用例中获取输入
  • 检查键是否存在,如果是,则打印序列,否则打印序列不存在
  • 解决方案将需要64*1000次运算,这可以很容易地在一秒钟内计算出来,并且可以避免这些竞赛通常会出现的超出时间限制的错误
  • 以代码形式(大部分代码不完整):

    <代码> /C++语法 map mp; void generateAll(){ //生成所有方程式 } 空干管(){ generateAll(); int n,t;scanf(“%d”,&t); 而(t--){ scanf(“%d”和“&n”); if(mp.find(n)!=mp.end()) //方程存在于输入端 其他的 //输入的方程式不存在 } }
    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
        }
    }