79.DS 计算
时长限制: 1000 MS
内存限制: 128 MB
描述
小明在你的帮助下,破密了Ferrari 设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)
输入
输入的第一行为一个整数n。接下来n行,每行一个算式。
输出
对n个算式,每行输出一个整数,表示计算结果。输出后换行。
示例输入
1
1+(3+2)*(7^2+6*9)/(2)
示例输出
258
解题思路
首先拆分括号为算式,然后根据运算优先级别,找到首先要运算的运算符,并在两侧查找数字并转换为Int进行计算
Ac源码(Java)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int times = in.nextInt();
in.nextLine();
String[] formulas = new String[times];
for (int i = 0; i < times; i++) {
formulas[i] = in.nextLine();
}
in.close();
for (String e : formulas) {
System.out.println(calc(e));
}
}
private static String calc(String e) {
//System.out.println(e);
// e = e.replaceAll("\\+-", "-");
// e = e.replaceAll("-", "+-");
// System.out.println(e);
// if(e.charAt(0) == '+'){
// e = e.replaceFirst("\\+-", "-");
// }
// System.out.println(e);
if (e.length() <= 0) {
return "";
}
int start = -1;
int end = -1;
int counter = 0;
int flag = 0;
for (int i = 0; i < e.length(); i++) { if (e.charAt(i) == '(') { if (start == -1) { start = i; flag = 1; } counter++; } if (e.charAt(i) == ')') { counter--; if (counter == 0) { end = i; break; } } } // System.out.println("" + start + "," + end); String l, r; l = ""; r = ""; if (flag == 1) { if (start > 0) {
l = e.substring(0, start);
}
if (e.length() - end > 0) {
r = e.substring(end + 1, e.length());
}
return calc(l + calc(e.substring(start + 1, end)) + r);
}
int index;
if (e.indexOf('^') > -1) {
flag = 2;
index = e.indexOf('^');
} else if (e.indexOf('*') > -1 || e.indexOf('/') > -1) {
flag = 3;
int a = e.indexOf('*');
int b = e.indexOf('/');
if ((a > -1 && b > -1 && a < b) || (a > -1 && b == -1)) {
index = a;
} else {
index = b;
}
} else if (e.indexOf('+') > -1 || e.length() > 0 && e.substring(1).indexOf('-') > -1) {
flag = 4;
int a = e.indexOf('+');
int b = e.substring(1).indexOf('-') + 1;
if ((a > 0 && b > 0 && a < b) || (a > 0 && b == 0)) {
index = a;
} else {
index = b;
}
} else {
index = -1;
}
//System.out.println(index);
if (flag > 1) {
// if (flag == 4) {
boolean superFlag = false;
start = 0;
for (int i = index - 1; i > -1; i--) {
if (!Character.isDigit(e.charAt(i))) {
if (!superFlag && e.charAt(i) == '-') {
superFlag = true;
continue;
}
start = i + 1;
break;
} else if (superFlag) {
start = i + 2;
break;
}
}
superFlag = false;
int i = index + 1;
end = e.length() - 1;
if (e.charAt(index + 1) == '-') {
superFlag = true;
i = index + 2;
}
for (; i < e.length(); i++) { if (!Character.isDigit(e.charAt(i))) { end = i - 1; break; } } String strL = e.substring(start, index); String strR = e.substring(index + 1, end + 1); //System.out.println(strL); //System.out.println(strR); int numL = 0; int numR = 0; if (strL.length() > 0) {
numL = Integer.parseInt(strL);
}
if (strR.length() > 0) {
numR = Integer.parseInt(strR);
}
// System.out.println(numL);
// System.out.println(numR);
int result = 0;
switch (flag) {
case 2: {
result = (int) Math.pow(numL, numR);
break;
}
case 3: {
if (e.charAt(index) == '*') {
result = numL * numR;
} else {
result = numL / numR;
}
break;
}
case 4: {
if (e.charAt(index) == '+') {
result = numL + numR;
} else {
result = numL - numR;
}
break;
}
}
if (start > 0) {
l = e.substring(0, start);
}
if (e.length() - 1 - end > 0) {
r = e.substring(end + 1, e.length());
}
return calc(l + result + r);
}
return e;
}
}
另外,很凑巧,近期由于其他原因上课,被要求做一个网页简易计算器,初步打算使用eval,但由于eval对次方支持不力,故将上方代码修改为Js使用
在线使用:>注意:键盘按键不可用<
/**
* 计算一个表达式
* @param {string} 输入的合法表达式
* @return {string} 返回的结果字符串
*/
function calc(e) {
if (e.length <= 0) {
return "";
}
let start = -1;
let end = -1;
let counter = 0;
let flag = 0;
for (let i = 0; i < e.length; i++) { if (e.charAt(i) == "(") { if (start == -1) { start = i; flag = 1; } counter++; } if (e.charAt(i) == ")") { counter--; if (counter == 0) { end = i; break; } } } let l, r; l = ""; r = ""; if (flag == 1) { if (start > 0) {
l = e.substring(0, start);
}
if (e.length - end > 0) {
r = e.substring(end + 1, e.length);
}
return calc(l + calc(e.substring(start + 1, end)) + r);
}
let index;
if (e.indexOf("^") > -1) {
flag = 2;
index = e.indexOf("^");
} else if (
e.indexOf("×") > -1 ||
e.indexOf("÷") > -1 ||
e.indexOf("%") > -1
) {
flag = 3;
let a = e.indexOf("×");
let b = e.indexOf("÷");
let c = e.indexOf("%");
index = min(a, b, c);
} else if (
e.indexOf("+") > -1 ||
(e.length > 0 && e.substring(1).indexOf("-") > -1)
) {
flag = 4;
let a = e.indexOf("+");
let b = e.substring(1).indexOf("-") + 1;
if ((a > 0 && b > 0 && a < b) || (a > 0 && b == 0)) {
index = a;
} else {
index = b;
}
} else {
index = -1;
}
if (flag > 1) {
let superFlag = false;
start = 0;
for (let i = index - 1; i > -1; i--) {
if (!Character.isDigit(e.charAt(i))) {
if (!superFlag && e.charAt(i) == "-") {
superFlag = true;
continue;
}
start = i + 1;
break;
} else if (superFlag) {
start = i + 2;
break;
}
}
superFlag = false;
let i = index + 1;
end = e.length - 1;
if (e.charAt(index + 1) == "-") {
superFlag = true;
i = index + 2;
}
for (; i < e.length; i++) { if (!Character.isDigit(e.charAt(i))) { end = i - 1; break; } } let strL = e.substring(start, index); let strR = e.substring(index + 1, end + 1); let numL = 0; let numR = 0; if (strL.length > 0) {
numL = parseFloat(strL);
}
if (strR.length > 0) {
numR = parseFloat(strR);
}
let result = 0;
switch (flag) {
case 2: {
result = Math.pow(numL, numR);
break;
}
case 3: {
if (e.charAt(index) == "×") {
result = numL * numR;
} else if (e.charAt(index) == "÷") {
result = numL / numR;
} else {
result = numL % numR;
}
break;
}
case 4: {
if (e.charAt(index) == "+") {
result = numL + numR;
} else {
result = numL - numR;
}
break;
}
}
if (start > 0) {
l = e.substring(0, start);
}
if (e.length - 1 - end > 0) {
r = e.substring(end + 1, e.length);
}
return calc(l + result + r);
}
for (let i = 0; i < e.length; i++) {
if (!(Character.isDigit(e.charAt(i)) || e.charAt(i) == "-")) {
throw "Wrong!";
}
}
return e;
}
完整网页代码下载:dscalc

