zoukankan      html  css  js  c++  java
  • 简单计算器

    简单计算器

    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 + 2
    4 + 2 * 5 - 7 / 11
    0
     
    Sample Output
    3.00
    13.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();
    
            }
        }
    }
  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/6363830.html
Copyright © 2011-2022 走看看