手柄君的小阁

个人私货聚集地

淮南师范学院OJ 79.DS 计算 & H5计算器

本文最后更新于 2019 年 9 月 12 日,其中的内容可能有所发展或发生改变,敬请注意。

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

来一发吐槽