題目連結:a017: 五則運算
JAVA 程式碼
//作者:骷骷 //網誌:http://bekachu.pixnet.net/blog import java.util.Scanner; public class JAVA { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String cal=sc.nextLine(); System.out.println( answerMe(cal.trim()) ); //算式的最後不能用空白做結尾 } sc.close(); } private static int answerMe(String cal){ int temp1=0; char op1=' '; int temp2=0; char op2=' '; int temp3=0; for(int i=0;i<cal.length();i++){ if(cal.charAt(i)=='('){ short t=1; int j=i+1; for(;j<cal.length();j++){ if(cal.charAt(j)=='('){ t++; }else if(cal.charAt(j)==')'){ t--; if(t==0){ break; } } } if(op1==' '){ temp1=answerMe( cal.substring(i+1,j).trim() ); //算式的最後不能用空白做結尾 }else if(op2==' '){ temp2=answerMe( cal.substring(i+1,j).trim() ); //算式的最後不能用空白做結尾 }else{ temp3=answerMe( cal.substring(i+1,j).trim() ); //算式的最後不能用空白做結尾 } i=j; //這裡的 j 是 相對應的右括號位置 if(opLevel(op1)<opLevel(op2)){ temp2=fiveOp(temp2,op2,temp3); op2=' '; if(j==cal.length()-1){ return fiveOp(temp1,op1,temp2); } }else if(op1!=' '&&op2!=' '){ temp1=fiveOp(temp1,op1,temp2); op1=op2; temp2=temp3; op2=' '; if(j==cal.length()-1){ return fiveOp(temp1,op1,temp2); } }else if(op1!=' '&&j==cal.length()-1){ return fiveOp(temp1,op1,temp2); } }else if('0'<=cal.charAt(i)&&cal.charAt(i)<='9'){ int j=i; for(;j<cal.length();j++){ if(cal.charAt(j)<'0'||'9'<cal.charAt(j)){ break; } } if(op1==' '){ temp1=Integer.parseInt( cal.substring(i, j) ); }else if(op2==' '){ temp2=Integer.parseInt( cal.substring(i, j) ); }else{ temp3=Integer.parseInt( cal.substring(i, j) ); } i=j-1; //這裡的 j 是數字的後一個位置 if(opLevel(op1)<opLevel(op2)){ temp2=fiveOp(temp2, op2, temp3); op2=' '; if(j==cal.length()){ return fiveOp(temp1, op1, temp2); } }else if(op1!=' '&&op2!=' '){ temp1=fiveOp(temp1, op1, temp2); op1=op2; temp2=temp3; op2=' '; if(j==cal.length()){ return fiveOp(temp1, op1, temp2); } }else if(op1!=' '&&j==cal.length()){ return fiveOp(temp1, op1, temp2); } }else if(cal.charAt(i)=='+'||cal.charAt(i)=='-'||cal.charAt(i)=='*'||cal.charAt(i)=='/'||cal.charAt(i)=='%'){ if(op1==' '){ op1=cal.charAt(i); }else if(op2==' '){ op2=cal.charAt(i); } } } return temp1; } private static int fiveOp(int a, char op, int b){ switch (op) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; case '%': return a%b; default: return 0; } } private static byte opLevel(char op){ //運算子的先後順序,byte 應該就夠分了 switch (op) { case '+': return 1; case '-': return 1; case '*': return 2; case '/': return 2; case '%': return 2; default: return 0; } } } /*測試資料: 2 + 3 * 4 14 2 * ( 3 + 4 ) * 5 70 */
==========
這次的題目比較不好寫,困擾骷骷很久,
上網查資料,發現跟 樹、前序、中序、後序 有關係,
雖然勉強看懂了,但是骷骷還是決定不使用這些資料結構的東西,
最後直接使用直觀的解法,就是將平常的一些規則寫出來,
先 () 後 *、/、% 再 +、- ,然後經過不斷地嘗試,
終於被骷骷寫出來了,再寫不出來,骷骷真的要哭哭了。
一開始被資料結構的東西束縛住,實在是非常討厭,
就算看懂了,使用起來也很麻煩,然後骷骷就先放著不管,
沒想到,這一放就是一個多月,
不過還好骷骷也算是堅持的人( 其實是倔強、不肯服輸 ),
今天靈感一現,之前的問題迎刃而解,
其實寫程式也是需要靈感的,
所以適當地休息、轉換心情,也是必要的,
不過骷骷比較懶惰,又缺乏靈感,需要的時間久了一些XD。
文章標籤
全站熱搜