题解:P12219 [蓝桥杯 2023 国 Java B] 不完整的算式
Ahws_rwhy
·
·
题解
呼,花了一个小时,总算调出来了。
思路:
此题是一道模拟题,思路容易想到,因为不知道 A,B,op,C 中哪个是被擦掉的,所以分别对这四种情况进行分类讨论即可,具体讨论,题解区有大佬一一列举出来了,故不再累述。这篇题解主要讲的是如何将 A,B,C 字符数组分别转化为数字的,这里我用的是 stoi 函数将字符数组转化为数字的,接着,关键的问题是我们如何将 A,B,op,C 四个字符数组中的内容(数字与符号)确定下来。
首先我们来看个例子:
其中有许多细节具体看代码:
```cpp
while (scanf("%c", &x) != EOF && x != '\n') {
t++;
if (x == '=' && flagd == 0) {
deng[0] = x;
flagd = 1;
continue;
}
if ((x == '+' || x == '-' || x == '*' || x == '/' || x == '?') && t != 1 && !flagop) {
flagop = 1;
op[0] = x;
continue;
}
if (x == '?') {
if (t == 1 && !flaga) {
a[0] = '?';
flaga = 1;
} else if (!flagb && !flagd) {
b[0] = '?';
flagb = 1;
} else if (!flagc && flagd) {
c[0] = '?';
flagc = 1;
}
continue;
}
// 正确存储数字字符
if (!flagd && !flagop && !flagb) {
ta[cnta++] = x;
} else if (!flagd && flagop && !flagb) {
b[cntb++] = x;
} else if (flagd && !flagc) {
tc[cntc++] = x;
}
}
```
之后的操作就比较简单了,注意分类讨论即可。
```cpp
int ans = atoi(c), b1 = atoi(b), a1 = atoi(a);
// cout << ans << " " << b1 << " " << a1 << endl;
// cout << c[0] << endl;
// 计算结果
if (a[0] == '?') {
if (op[0] == '+') cout << (ans - b1);
else if (op[0] == '-') cout << (ans + b1);
else if (op[0] == '/') cout << (ans * b1);
else if (op[0] == '*') cout << (ans / b1);
} else if (op[0] == '?') {
if (a1 + b1 == ans) cout << "+";
else if (a1 - b1 == ans) cout << "-";
else if (a1 / b1 == ans && b1 != 0) cout << "/";
else if (a1 * b1 == ans) cout << "*";
} else if (b[0] == '?') {
// cout << "NBBBB!" << endl;
if (op[0] == '+') cout << (ans - a1);
else if (op[0] == '-') cout << (a1 - ans);
else if (op[0] == '*') cout << (ans / a1);
else if (op[0] == '/') cout << (a1 / ans);
} else if (c[0] == '?') {
if (op[0] == '+') cout << (a1 + b1);
if (op[0] == '-') cout << (a1 - b1);
if (op[0] == '*') cout << (a1 * b1);
else if (op[0] == '/') cout << (a1 / b1);
}
```
```Java``` 代码:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
char[] arr=str.toCharArray();
int index=-1;
for (int i = 0; i < arr.length; i++) {
if(arr[i]=='?'){index=i;break;}
}
if(index==arr.length-1){
char op=' ';int a=-1;
for (int i = 0; i <arr.length ; i++) {
char c=arr[i];
if(c=='+'||c=='-'||c=='*'||c=='/'){
op= c;
a=i;
break;
}
}
String A=str.substring(0,a);
String B=str.substring(a+1,arr.length-2);
int x=Integer.valueOf(A);
int y=Integer.valueOf(B);
if(op=='+'){
System.out.print(x+y);
} else if (op=='-') {
System.out.print(x-y);
} else if (op=='*') {
System.out.print(x*y);
} else if (op=='/') {
System.out.print(x/y);
}
} else if ((arr[index+1]>='0'&&arr[index+1]<='9')&&(arr[index-1]>='0'&&arr[index-1]<='9')) {
String A=str.substring(0,index);
int a=-1;
for (int i = 0; i < arr.length; i++) {
if(arr[i]=='='){a=i;break;}
}
String B=str.substring(index+1,a);
String C=str.substring(a+1);
int x=Integer.valueOf(A);
int y=Integer.valueOf(B);
int z=Integer.valueOf(C);
if(x+y==z){
System.out.print("+");
} else if (x-y==z) {
System.out.print("-");
} else if (x*y==z) {
System.out.print("*");
} else if (x/y==z) {
System.out.print("/");
}
} else if (index==0) {
char op=arr[1];
int a=-1;
for (int i = 2; i <arr.length ; i++) {
char c=arr[i];
if(c=='='){
a=i;
break;
}
}
String B=str.substring(2,a);
String C=str.substring(a+1);
int b=Integer.valueOf(B);
int c=Integer.valueOf(C);
if(op=='+'){
System.out.print(c-b);
} else if (op=='-') {
System.out.print(c+b);
} else if (op=='*') {
System.out.print(c/b);
} else if (op=='/') {
System.out.print(c*b);
}
}else {
char op=' ';
int d=-1;
for (int i = 0; i < arr.length; i++) {
char c=arr[i];
if(c<'0'||c>'9'){
op=c;
d=i;
break;
}
}
String A=str.substring(0,d);
String C=str.substring(d+3);
int a=Integer.valueOf(A);
int c=Integer.valueOf(C);
if(op=='+'){
System.out.print(c-a);
} else if (op=='-') {
System.out.print(a-c);
} else if (op=='*') {
System.out.print(c/a);
} else if (op=='/') {
System.out.print(a/c);
}
}
}
}
```