简单计算器
简单计算器 |
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(); } } }
我每天都在努力,只是想证明我是认真的活着.