top1编程
← 返回题目
题解

添加运算符

1 条题解

  • 0
    @ 2026-8-6 0:09:19

    P4692 添加运算符(【基础】)

    解题思路

    四个数之间有 3 个空位,每个空位可以填 +、-、*、/ 四种运算符,所以一共有 4×4×4=64 种填法。我们把所有填法都枚举一遍,每次从左往右计算整个式子的值,如果结果等于给定的 n,就把方法数加一。下面分四步实现。

    **第一步,读入。**读入 4 个数存进 nums 数组,再读入目标值 target。

    第二步,写运算函数。calc(x, y, op) 负责两个数做一次运算:op=0 是加法、1 是减法、2 是乘法、3 是除法(整除)。

    **第三步,三重循环枚举。**三个空位分别用 i、j、k 表示,每个从 0 到 3 枚举四种运算符,一共 4×4×4=64 种情况。每次严格从左往右套用:calc(calc(calc(nums[0], nums[1], i), nums[2], j), nums[3], k),结果存进 result。

    **第四步,统计答案。**如果 result 等于目标值 target,方法数 ways 加一。最后输出 ways。

    题目特别说明:运算符严格从左往右计算,不考虑乘法优先级,所以不能像普通四则运算那样先算乘法。除法是整除,也就是整数除法,两个整数相除只保留商的整数部分,比如 7/2=3。

    打个比方:就像把三个空格当成三个抽屉,每个抽屉里放一个符号,我们把所有可能的放法都试一遍,看哪种能让结果正好等于目标值。因为只有 64 种情况,非常少,全部试完也不会超时。

    参考代码

    // P4692 添加运算符:4个数之间填+ - * /,从左往右算,统计结果等于n的方案数
    #include <iostream>
    using namespace std;
    
    // 两个数做一次运算,op=0加 1减 2乘 3整除
    int calc(int x, int y, int op) {
        if (op == 0) return x + y;
        if (op == 1) return x - y;
        if (op == 2) return x * y;
        return x / y;   // 整除
    }
    
    int main() {
        int nums[4], target;
        for (int i = 0; i < 4; i++) cin >> nums[i];
        cin >> target;
        int ways = 0;
        // 枚举3个空位的4种运算符,共4*4*4=64种
        for (int i = 0; i < 4; i++)
            for (int j = 0; j < 4; j++)
                for (int k = 0; k < 4; k++) {
                    // 严格从左往右计算:((a[0] op1 a[1]) op2 a[2]) op3 a[3]
                    int result = calc(calc(calc(nums[0], nums[1], i), nums[2], j), nums[3], k);
                    if (result == target) ways++;
                }
        cout << ways << endl;
        return 0;
    }
    

    复杂度分析

    枚举 4×4×4=64 种情况,每次计算是常数次运算,时间复杂度 O(1)。空间上只用几个变量,也是 O(1)。

    • 1