目录
题目
思路和解题方法
步骤 1:识别缺失的部分
步骤 2:根据已知条件计算或推断
步骤 3:处理特殊情况和验证
c++ 代码
Java 版本
Python 版本(仅供参考)
代码和解题细节:
题目
题目链接:https://www.lanqiao.cn/problems/17135/learning/
思路和解题方法
步骤 1:识别缺失的部分
首先,需要确定算式中哪一部分被擦掉了。通过遍历输入的字符串,我们可以很容易地识别出
A
、op
、B
、C
中哪个位置被替换成了?
。步骤 2:根据已知条件计算或推断
一旦确定了缺失的部分,就可以根据算式的其他部分进行计算或推断。
- 如果缺失的是
C
:
- 我们可以直接计算
A op B
的结果。这需要根据op
的类型进行相应的运算。- 如果缺失的是
A
或B
:
- 我们可以将等式重写为
A = C / B
(如果op
是/
且B ≠ 0
)或者A = C - B
(如果op
是-
)、A = C + B
(如果op
是+
)、A = C * B
(如果op
是*
),然后计算出缺失的值。- 如果缺失的是
op
:
- 我们需要根据
A
和B
计算出可能的操作符,使得A op B = C
成立。可以通过尝试所有操作符并检查哪个能得出正确的C
值来实现。步骤 3:处理特殊情况和验证
- 在执行除法时,需要注意分母不能为零的情况。
- 确保计算的结果符合题目要求的非负整数条件。
- 检查是否有唯一解,因为题目保证了有唯一解,如果有多个可能的答案,则说明可能存在误解或计算错误。
c++ 代码
#include <iostream>
#include <string>
using namespace std;
// 将字符串s中从l到r的子串转换为整数
int calc(int l, int r, string s) {
int res = 0;
for (int i = l; i <= r; i++) {
// 将字符数字转换为其对应的整数值并累加
res = res * 10 + (s[i] - '0');
}
return res;
}
int main() {
string s;
cin >> s; // 读取输入的算式字符串
int idx = s.find('?'); // 找到问号的位置
int idx1 = s.find('='); // 找到等号的位置
// 根据问号的位置执行不同的逻辑
if (idx == 0) { // 如果问号在最前面(缺失A)
char c = s[idx + 1]; // 获取运算符
int a = calc(idx + 2, idx1 - 1, s); // 计算B的值
int b = calc(idx1 + 1, s.length() - 1, s); // 计算C的值
// 根据运算符计算缺失的A
if (c == '+') cout << b - a << endl;
else if (c == '-') cout << b + a << endl;
else if (c == '*') cout << b / a << endl;
else cout << b * a << endl;
} else if (idx == s.length() - 1) { // 如果问号在最后面(缺失C)
int idxA = s.find('+'), idxB = s.find('-'), idxC = s.find('*'), idxD = s.find('/'); // 查找运算符位置
// 根据找到的运算符计算C
if (idxA != -1) cout << calc(0, idxA - 1, s) + calc(idxA + 1, idx1 - 1, s) << endl;
else if (idxB != -1) cout << calc(0, idxB - 1, s) - calc(idxB + 1, idx1 - 1, s) << endl;
else if (idxC != -1) cout << calc(0, idxC - 1, s) * calc(idxC + 1, idx1 - 1, s) << endl;
else cout << calc(0, idxD - 1, s) / calc(idxD + 1, idx1 - 1, s) << endl;
} else if (idx == idx1 - 1) { // 如果问号在等号前(缺失B)
char c = s[idx - 1]; // 获取运算符
int a = calc(0, idx - 2, s); // 计算A的值
int b = calc(idx1 + 1, s.length() - 1, s); // 计算C的值
// 根据运算符计算缺失的B
if (c == '+') cout << b - a << endl;
else if (c == '-') cout << a - b << endl;
else if (c == '*') cout << b / a << endl;
else cout << a / b << endl;
} else { // 如果问号是运算符(缺失op)
int a = calc(0, idx - 1, s); // 计算A的值
int b = calc(idx + 1, idx1 - 1, s); // 计算B的值
int c = calc(idx1 + 1, s.length() - 1, s); // 计算C的值
// 通过尝试加减乘除来确定正确的运算符
if (a + b == c) cout << '+' << endl;
else if (a - b == c) cout << '-' << endl;
else if (a * b == c) cout << '*' << endl;
else cout << '/' << endl;
}
return 0;
}
Java 版本
import java.util.Scanner;
public class Main {
// 方法:将字符串s中从索引l到r的子串转换为整数
static int calc(int l, int r, String s) {
int res = 0;
for (int i = l; i <= r; i++) {
// 将字符转换为数字并累加到结果中
res = res * 10 + (s.charAt(i) - '0');
}
return res;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next(); // 读取输入的字符串表达式
int idx = s.indexOf('?'); // 找到问号的位置
int idx1 = s.indexOf('='); // 找到等号的位置
// 分情况讨论问号的位置
if (idx == 0) { // 问号在最前面
char c = s.charAt(idx + 1); // 获取操作符
int a = calc(idx + 2, idx1 - 1, s); // 计算左侧数字
int b = calc(idx1 + 1, s.length() - 1, s); // 计算右侧数字
// 根据操作符输出结果
if (c == '+') System.out.println(b - a);
else if (c == '-') System.out.println(b + a);
else if (c == '*') System.out.println(b / a);
else System.out.println(b * a);
} else if (idx == s.length() - 1) { // 问号在最后面
// 寻找并处理其他运算符
int idxA = s.indexOf('+'), idxB = s.indexOf('-'), idxC = s.indexOf('*'), idxD = s.indexOf('/');
// 根据找到的第一个运算符计算并输出结果
if (idxA != -1) System.out.println(calc(0, idxA - 1, s) + calc(idxA + 1, idx1 - 1, s));
else if (idxB != -1) System.out.println(calc(0, idxB - 1, s) - calc(idxB + 1, idx1 - 1, s));
else if (idxC != -1) System.out.println(calc(0, idxC - 1, s) * calc(idxC + 1, idx1 - 1, s));
else System.out.println(calc(0, idxD - 1, s) / calc(idxD + 1, idx1 - 1, s));
} else if (idx == idx1 - 1) { // 问号紧挨着等号前
char c = s.charAt(idx - 1); // 获取操作符
int a = calc(0, idx - 2, s); // 左侧数字
int b = calc(idx1 + 1, s.length() - 1, s); // 右侧数字
// 根据操作符输出结果
if (c == '+') System.out.println(b - a);
else if (c == '-') System.out.println(a - b);
else if (c == '*') System.out.println(b / a);
else System.out.println(a / b);
} else { // 问号在中间
int a = calc(0, idx - 1, s); // 左边数字
int b = calc(idx + 1, idx1 - 1, s); // 问号左边的数字
int c = calc(idx1 + 1, s.length() - 1, s); // 右边数字
// 判断并输出正确的操作符
if (a + b == c) System.out.println('+');
else if (a - b == c) System.out.println('-');
else if (a * b == c) System.out.println('*');
else System.out.println('/');
}
}
}
Python 版本(仅供参考)
# 定义一个函数来计算字符串s中从位置l到r的数字值
def calc(l, r, s):
res = 0 # 初始化结果变量
for i in range(l, r + 1): # 遍历指定的索引范围
res = res * 10 + int(s[i]) # 将字符转换为整数并累加到结果中
return res # 返回计算的整数值
# 获取用户输入的字符串
s = input()
# 查找问号和等号的位置
idx = s.find('?')
idx1 = s.find('=')
# 根据问号的位置处理不同情况
if idx == 0: # 问号在最前面的情况
c = s[idx + 1] # 获取运算符
a = calc(idx + 2, idx1 - 1, s) # 计算左侧操作数
b = calc(idx1 + 1, len(s) - 1, s) # 计算右侧操作数
# 根据运算符执行相应操作
if c == '+':
print(b - a)
elif c == '-':
print(b + a)
elif c == '*':
print(b // a)
else: # c == '/'
print(b * a)
elif idx == len(s) - 1: # 问号在最后面的情况
# 寻找四种基本运算符的位置
idxA, idxB, idxC, idxD = s.find('+'), s.find('-'), s.find('*'), s.find('/')
# 根据找到的运算符执行相应的计算
if idxA != -1:
a = calc(0, idxA - 1, s)
b = calc(idxA + 1, idx1 - 1, s)
print(a + b)
elif idxB != -1:
a = calc(0, idxB - 1, s)
b = calc(idxB + 1, idx1 - 1, s)
print(a - b)
elif idxC != -1:
a = calc(0, idxC - 1, s)
b = calc(idxC + 1, idx1 - 1, s)
print(a * b)
else: # idxD != -1
a = calc(0, idxD - 1, s)
b = calc(idxD + 1, idx1 - 1, s)
print(a // b)
elif idx == idx1 - 1: # 问号在等号前一位的情况
c = s[idx - 1] # 获取运算符
a = calc(0, idx - 2, s) # 计算左侧操作数
b = calc(idx1 + 1, len(s) - 1, s) # 计算右侧操作数
# 执行相应的计算
if c == '+':
print(b - a)
elif c == '-':
print(a - b)
elif c == '*':
print(b // a)
else: # c == '/'
print(a // b)
else: # 问号在其他位置的情况
a = calc(0, idx - 1, s) # 计算左侧操作数
b = calc(idx + 1, idx1 - 1, s) # 计算中间操作数
c = calc(idx1 + 1, len(s) - 1, s) # 计算右侧操作数
# 检查哪一种运算符能使等式成立,并打印它
if a + b == c:
print('+')
elif a - b == c:
print('-')
elif a * b == c:
print('*')
else: # a / b == c
print('/')
代码和解题细节:
正确处理边界条件:
- 确保在处理字符串索引时避免越界。例如,在计算数值或查找运算符之前,确认索引位置在字符串的有效范围内。
- 当处理除法时,仔细检查除数是否为0,以避免运行时错误。
识别唯一解的约束:
- 题目明确指出有唯一解,这意味着在尝试不同运算符或计算过程时,应直接寻找能够满足这一条件的解,而不是考虑多种可能性。
注意整数除法的处理:
- 当涉及整数除法(
/
)时,确保使用整数除法运算符(在C++中是/
,但在某些语言中可能需要特别指定),并且理解其结果会向下取整。优化逻辑判断:
- 对于特定情况的处理(如问号在不同位置),代码中已经进行了区分。但应注意逻辑的简洁性和效率,避免不必要的重复计算或复杂的嵌套条件。
处理特殊字符和格式:
- 确保输入处理时考虑到所有可能的格式问题,如前导零、额外的空格等,尽管题目说明不会有这些问题,但在实际编程时这些往往是常见的输入错误来源。
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。