题解:P12219 [蓝桥杯 2023 国 Java B] 不完整的算式

· · 题解

呼,花了一个小时,总算调出来了。

思路:

此题是一道模拟题,思路容易想到,因为不知道 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); } } } } ```