首页 > 代码库 > 简单计算器

简单计算器

简单计算器

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 147 Accepted Submission(s): 80
 
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
 
Output

            对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 
Sample Input
1 + 24 + 2 * 5 - 7 / 110
 
Sample Output
3.0013.36
 
 
Source
浙大计算机研究生复试上机考试-2006年
 
Recommend
JGShining
 
import java.math.BigDecimal;import java.util.LinkedList;import java.util.Scanner;public class Main {    /*    题意:汉语题目就不多说了    初步思路:简单的模拟,就是读取的时候有点麻烦,没事字符串截取,然后写一个转化函数马上就可以了    #错误:打脸瞬间打脸......脑子怎么回事,运算符的优先级都忘了!!!    #改进;用java搞,大数的问题解决了,然后将所有的东西存进链表,从头开始遍历,遇到运算符号,按照优先级将两侧的数进行        整合,先算乘法,再算除法,在加减,但是现在的问题来了...写残了...    #二次改进:懵了,看了题解才发现不用大数,数据这么不严谨,200位的话怎么搞。用栈来模拟优先级的运算    #三次改进:实际情况第一次改进的想法错了,第二次改进没毛病,但是...用java交的时候要把包名去了.....    */    public static void main(String[] args) {        // write your code here        Scanner cin=new Scanner(System.in);        while(cin.hasNext()){            String str = cin.nextLine();// 接收输入的字符串            if (str.compareTo("0") == 0) {// 若是只输入0,则结束                break;            }            String[] strs = str.split(" ");// 根据题目要求,分割字符串            //利用LinkedList来模拟队列的入队出队,从而实现简单的运算            LinkedList<BigDecimal> s1 = new LinkedList<>();            LinkedList<String> s2 = new LinkedList<>();            s1.add(new BigDecimal(strs[0]));            for (int i = 1; i < strs.length; i++) {                // 如果出现“*”or“/”就把他相邻的两个数进行对应运算,并加入s1中                if (strs[i].compareTo("*") == 0) {                    i++;// 取“*”后一个数值                    BigDecimal m = s1.getLast();                    s1.pollLast();                    BigDecimal res=new BigDecimal(strs[i]);                    s1.add(m .multiply(res));                    continue;                }                if (strs[i].compareTo("/") == 0) {                    i++;                    BigDecimal m = s1.getLast();                    s1.pollLast();                    BigDecimal res=new BigDecimal(strs[i]);                    s1.add(m .divide(res,220,BigDecimal.ROUND_HALF_UP));                    continue;                }                // 如果是“+”or“-”号就加入到s2中                if ((strs[i].compareTo("+") == 0)                        || (strs[i].compareTo("-") == 0)) {                    s2.add(strs[i]);                    continue;                }                s1.add(new BigDecimal(strs[i])); // 把所有没有运算的数值装进来            }            BigDecimal sum = s1.pollFirst();// 先取出队尾给sum            //System.out.println(sum);            //从模拟队列中取出符号和数值进行运算,直到为空            while (!s1.isEmpty()) {                BigDecimal e=s1.pollFirst();                String symbol=s2.pollFirst();                //System.out.print(symbol);                //System.out.println();                if(symbol.equals("+")){                    BigDecimal tmp=sum.add(e);                    sum=tmp;                }else{                    BigDecimal tmp=sum.subtract(e);                    sum=tmp;                }            }            System.out.printf("%.2f", sum);            System.out.println();        }    }}

 

简单计算器