P10839 【MX-J2-T0】Turtle and Equations

题目传送门 

思路:

  1. 理解问题

    • 给定四个正整数 abcd
    • 需要在一个算式 (a □ b) □ c 中填入两个运算符(+-*),使得算式的结果等于 d
  2. 确定运算符组合

    • 共有三种运算符 +-*,每个运算符可以重复使用。
    • 因此,两个运算符的组合共有  种可能性。
  3. 枚举所有可能的运算符组合

    • 使用双重循环遍历所有可能的运算符组合。
    • 对于每一种组合,计算算式的结果。
  4. 计算算式结果

    • 根据第一个运算符计算 (a □ b) 的结果。
    • 然后根据第二个运算符计算 (a □ b) □ c 的结果。
  5. 检查结果是否等于 d

    • 如果计算结果等于 d,则输出 "Yes" 并结束程序。
    • 如果遍历完所有组合后仍未找到符合条件的结果,则输出 "No"。
  6. 优化与边界处理

    • 由于数据范围较小(1 ≤ a, b, c ≤ 101 ≤ d ≤ 1000),暴力枚举的方法是可行的。
    • 注意处理运算过程中的边界情况,如乘法可能导致结果超出整数范围。

具体步骤:

  1. 输入读取:从标准输入读取四个正整数 abcd
  2. 定义运算符数组:定义一个包含三种运算符 +-* 的数组。
  3. 双重循环遍历运算符组合
    • 外层循环遍历第一个运算符。
    • 内层循环遍历第二个运算符。
  4. 计算中间结果
    • 根据第一个运算符计算 (a □ b) 的结果。
    • 根据第二个运算符计算 (a □ b) □ c 的结果。
  5. 检查结果
    • 如果计算结果等于 d,输出 "Yes" 并结束程序。
    • 如果遍历完所有组合后仍未找到符合条件的结果,输出 "No"。

代码&解释:

c++代码:

#include <iostream>
using namespace std;

int main() {
    int a, b, c, d;
    cin >> a >> b >> c >> d;

    char operators[] = {'+', '-', '*'};
    bool found = false;

    for (char op1 : operators) {
        for (char op2 : operators) {
            int result;
            if (op1 == '+') {
                result = a + b;
            } else if (op1 == '-') {
                result = a - b;
            } else if (op1 == '*') {
                result = a * b;
            }

            if (op2 == '+') {
                result += c;
            } else if (op2 == '-') {
                result -= c;
            } else if (op2 == '*') {
                result *= c;
            }

            if (result == d) {
                found = true;
                break;
            }
        }
        if (found) break;
    }

    if (found) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }

    return 0;
}

代码解释

  1. 输入读取:从标准输入读取四个正整数 abcd
  2. 运算符数组:定义一个包含三种运算符 +-* 的数组。
  3. 双重循环:使用双重循环遍历所有可能的运算符组合。
  4. 计算结果:根据当前的运算符组合计算中间结果,并进一步计算最终结果。
  5. 结果比较:检查计算结果是否等于 d,如果相等则标记为找到。
  6. 输出结果:根据是否找到合适的运算符组合输出 "Yes" 或 "No"。

Python代码:

def can_achieve_result(a, b, c, d):
    operators = ['+', '-', '*']
    
    for op1 in operators:
        for op2 in operators:
            if op1 == '+':
                intermediate_result = a + b
            elif op1 == '-':
                intermediate_result = a - b
            elif op1 == '*':
                intermediate_result = a * b
            
            if op2 == '+':
                final_result = intermediate_result + c
            elif op2 == '-':
                final_result = intermediate_result - c
            elif op2 == '*':
                final_result = intermediate_result * c
            
            if final_result == d:
                return "Yes"
    
    return "No"

# 读取输入
a, b, c, d = map(int, input().split())

# 输出结果
print(can_achieve_result(a, b, c, d))

代码解释:

  1. 函数定义:定义一个函数 can_achieve_result 来判断是否能得到期望的结果 d
  2. 运算符数组:定义一个包含三种运算符 +-* 的数组。
  3. 双重循环:使用双重循环遍历所有可能的运算符组合。
  4. 计算中间结果:根据第一个运算符计算 (a □ b) 的结果。
  5. 计算最终结果:根据第二个运算符计算 (a □ b) □ c 的结果。
  6. 检查结果:如果计算结果等于 d,返回 "Yes",否则继续遍历。
  7. 输入输出:读取输入并调用函数输出结果。

Pascal代码:

program CheckExpression;

var
    a, b, c, d: integer;
    op1, op2: char;
    intermediate_result, final_result: integer;
    found: boolean;
    operators: array[1..3] of char = ('+', '-', '*');

begin
    readln(a, b, c, d);
    found := false;

    for op1 in operators do
    begin
        for op2 in operators do
        begin
            if op1 = '+' then
                intermediate_result := a + b
            else if op1 = '-' then
                intermediate_result := a - b
            else if op1 = '*' then
                intermediate_result := a * b;
            
            if op2 = '+' then
                final_result := intermediate_result + c
            else if op2 = '-' then
                final_result := intermediate_result - c
            else if op2 = '*' then
                final_result := intermediate_result * c;
            
            if final_result = d then
            begin
                found := true;
                break;
            end;
        end;
        if found then break;
    end;

    if found then
        writeln('Yes')
    else
        writeln('No');
end.

代码解释:

  1. 变量声明:声明所需的变量,包括输入的四个整数、运算符、中间结果和最终结果。
  2. 运算符数组:定义一个包含三种运算符 +-* 的数组。
  3. 双重循环:使用双重循环遍历所有可能的运算符组合。
  4. 计算中间结果:根据第一个运算符计算 (a □ b) 的结果。
  5. 计算最终结果:根据第二个运算符计算 (a □ b) □ c 的结果。
  6. 检查结果:如果计算结果等于 d,标记为找到并跳出循环。
  7. 输出结果:根据是否找到合适的运算符组合输出 "Yes" 或 "No"。

希望这些代码能帮助您理解并解决这个问题,如果有问题,请随时提问。
  蒟蒻题解,神犇勿喷,点个赞再走吧!QAQ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值