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();
    
            }
        }
    }
  • 相关阅读:
    阿里云盾证书服务助力博客装逼成功
    内容安全策略(CSP)_防御_XSS_攻击的好助手
    Spring-beans架构设计原理
    Httpclient核心架构设计
    第四章 数据类型—字典(dict)、集合(set)
    第三章 数据类型 — 列表(list)、元组(tuple)
    第三章 数据类型 — int、bool 和 str
    第二章 Python基础(二)
    pycharm快捷键
    第二章 Python基础(一)
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/6363830.html
Copyright © 2011-2022 走看看