|  | 
 
| 
本帖最后由 zhangjinxuan 于 2022-10-15 21:07 编辑
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 最近在做24点计算器,计算的函数写好了,但是有一个问题,返回的表达式得从左往右计算才可得到结果24
 
 运行实况:
 
 
 复制代码请输入数字个数:4
请输入4个数字:1 2 3 4
此题有解,解法是:1+2+3*4
 1+2+3*4,它算出来的结果应该是15,但我想让它算出来的结果是24,就只能这样去加括号:
 
 
 但仍然有问题,我该怎么去实现啊?
 
 昨晚盯着一个算式盯了1个小时都没有想出来
   
 如果题目还不理解,那就理解为:
 给你一个表达式,在表达式中添加一些括号(不能添加多余的括号),使这个表达式与从左往右计算的表达式结果相同
 样例1:
 
 样例2:
 
 复制代码输入:9-8*1*8-6/2
输出:(9-8)*1*(8-6)/2
 本帖最后由 dolly_yos2 于 2022-10-15 16:10 编辑 
可以测试一下看看是不是这个意思(总觉得写复杂了)(假设操作数总在 int 范围内、输入总是以操作数开始、除最后一个操作数外每个操作数后总是紧接着一个四则运算符、每个四则运算符后总是紧接着一个操作数、输入中没有任何其他符号)
 复制代码#include <iostream>
#include <vector>
void parse_helper(
        const std::vector<int>& operands,
        const std::vector<char>& operators,
        const size_t level,
        std::ostream& output
){
        bool issue_parentheses = false;
        if(level > 0){
                if(!(operators.at(level) & 4u) && (operators.at(level - 1) & 4u)){
                        issue_parentheses = true;
                        output.put('(');
                }
                parse_helper(operands, operators, level - 1, output);
        }else{
                output << operands.at(0);
        }
        if(issue_parentheses) output.put(')');
        output.put(operators.at(level) - 1);
        output << operands.at(level + 1);
}
void parse(std::istream& input, std::ostream& output){
        std::vector<int> operands;
        std::vector<char> operators;
        int value;
        char op;
        input >> value;
        operands.emplace_back(value);
        while(true){
                input >> op >> value;
                if(input.eof()) break;
                operands.emplace_back(value);
                operators.emplace_back(op + 1);        // 一个小小的 trick 来简化算符优先级判断
                                                // 考虑到 ASCII 下四则运算符的码值分别为
                                                //  * -- 0x2A (00101010)
                                                //  + -- 0x2B (00101011)
                                                //  - -- 0x2D (00101101)
                                                //  / -- 0x2F (00101111)
                                                // 给码值加一后可见高优先级运算符的第三低有效位(从一开始)
                                                //  均为 0 而低优先级的均为 1
        }
        parse_helper(operands, operators, operators.size() - 1, output);
}
int main(){
        parse(std::cin, std::cout);
        return 0;
}
 | 
 |