题目传送门
思路:
-
理解问题:
- 给定四个正整数
a
,b
,c
,d
。 - 需要在一个算式
(a □ b) □ c
中填入两个运算符(+
,-
,*
),使得算式的结果等于d
。
- 给定四个正整数
-
确定运算符组合:
- 共有三种运算符
+
,-
,*
,每个运算符可以重复使用。 - 因此,两个运算符的组合共有 种可能性。
- 共有三种运算符
-
枚举所有可能的运算符组合:
- 使用双重循环遍历所有可能的运算符组合。
- 对于每一种组合,计算算式的结果。
-
计算算式结果:
- 根据第一个运算符计算
(a □ b)
的结果。 - 然后根据第二个运算符计算
(a □ b) □ c
的结果。
- 根据第一个运算符计算
-
检查结果是否等于
d
:- 如果计算结果等于
d
,则输出 "Yes" 并结束程序。 - 如果遍历完所有组合后仍未找到符合条件的结果,则输出 "No"。
- 如果计算结果等于
-
优化与边界处理:
- 由于数据范围较小(
1 ≤ a, b, c ≤ 10
,1 ≤ d ≤ 1000
),暴力枚举的方法是可行的。 - 注意处理运算过程中的边界情况,如乘法可能导致结果超出整数范围。
- 由于数据范围较小(
具体步骤:
- 输入读取:从标准输入读取四个正整数
a
,b
,c
,d
。 - 定义运算符数组:定义一个包含三种运算符
+
,-
,*
的数组。 - 双重循环遍历运算符组合:
- 外层循环遍历第一个运算符。
- 内层循环遍历第二个运算符。
- 计算中间结果:
- 根据第一个运算符计算
(a □ b)
的结果。 - 根据第二个运算符计算
(a □ b) □ c
的结果。
- 根据第一个运算符计算
- 检查结果:
- 如果计算结果等于
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;
}
代码解释
- 输入读取:从标准输入读取四个正整数
a
,b
,c
,d
。 - 运算符数组:定义一个包含三种运算符
+
,-
,*
的数组。 - 双重循环:使用双重循环遍历所有可能的运算符组合。
- 计算结果:根据当前的运算符组合计算中间结果,并进一步计算最终结果。
- 结果比较:检查计算结果是否等于
d
,如果相等则标记为找到。 - 输出结果:根据是否找到合适的运算符组合输出 "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))
代码解释:
- 函数定义:定义一个函数
can_achieve_result
来判断是否能得到期望的结果d
。 - 运算符数组:定义一个包含三种运算符
+
,-
,*
的数组。 - 双重循环:使用双重循环遍历所有可能的运算符组合。
- 计算中间结果:根据第一个运算符计算
(a □ b)
的结果。 - 计算最终结果:根据第二个运算符计算
(a □ b) □ c
的结果。 - 检查结果:如果计算结果等于
d
,返回 "Yes",否则继续遍历。 - 输入输出:读取输入并调用函数输出结果。
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.
代码解释:
- 变量声明:声明所需的变量,包括输入的四个整数、运算符、中间结果和最终结果。
- 运算符数组:定义一个包含三种运算符
+
,-
,*
的数组。 - 双重循环:使用双重循环遍历所有可能的运算符组合。
- 计算中间结果:根据第一个运算符计算
(a □ b)
的结果。 - 计算最终结果:根据第二个运算符计算
(a □ b) □ c
的结果。 - 检查结果:如果计算结果等于
d
,标记为找到并跳出循环。 - 输出结果:根据是否找到合适的运算符组合输出 "Yes" 或 "No"。