2013-10-26 55 views
1

當我計算(1 3 +)時,我得到了正確的答案。但是當我計算如(A 1 +)這樣的語句時,我得到了錯誤的答案。計算十六進制數字時發生錯誤

在這個問題中,我嘗試評估像(5 7 + 7 * 8 +〜)這樣的十六進制語句。

這是代碼。

import java.io.*; 
import java.util.Stack; 


/** 
* 
* @author Dilini 
*/ 
public class Acadox { 

    /** 
    * @param args the command line arguments 
    */ 


    public static boolean isOperator(String c) 
    { 
     return ("+".equals(c) || "-".equals(c) || "&".equals(c) || "|".equals(c) || "~".equals(c) || "X".equals(c)); 
    } 



    /* public String convert(String str) 
    { 
      char[] chars = str.toCharArray(); 
      StringBuffer strBuffer = new StringBuffer(); 
      for (int i = 0; i < chars.length; i++) 
      { 
      strBuffer.append(Integer.toHexString((int) chars[i])); 
      } 
      return strBuffer.toString(); 
    }*/ 

    public static void main(String[] args)throws IOException { 
     // TODO code application logic here 

     try 
     { 
      BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); 

      String s[]=read.readLine().split(" "); 

      Stack<String> st=new Stack<String>(); 

      st.push(s[0]); 
      int i=1; 

      int num1,num2,result=0; 

      if(isOperator(s[1]) && !"~".equals(s[1])) 
      { 
       System.out.println("ERROR"); 
      } 
      else if(!isOperator(s[s.length-1])) 
      { 
       System.out.println("ERROR"); 
      } 
      else 
      { 
       do 
       { 
        if(!isOperator(s[i])) 
        { 
         st.push(s[i]); 
         i++; 
        } 
        else 
        { 


         if("+".equals(s[i])) 
         { 
          num1 = Integer.parseInt(st.pop(), 16); 
          num2 = Integer.parseInt(st.pop(), 16); 

          result=num1+num2; 
          st.push(""+result); 
         } 
         else if("-".equals(s[i])) 
         { 
          num1 = Integer.parseInt(st.pop(), 16); 
          num2 = Integer.parseInt(st.pop(), 16); 

          result=num1-num2; 
          st.push(""+result); 
         } 
         else if("&".equals(s[i])) 
         { 
          num1 = Integer.parseInt(st.pop(), 16); 
          num2 = Integer.parseInt(st.pop(), 16); 

          result=num1&num2; 
          st.push(""+result); 
         } 
         else if("|".equals(s[i])) 
         { 
          num1 = Integer.parseInt(st.pop(), 16); 
          num2 = Integer.parseInt(st.pop(), 16); 

          result=num1|num2; 
          st.push(""+result); 
         } 
         else if("~".equals(s[i])) 
         { 
          num1 = Integer.parseInt(st.pop(), 16); 

          result=~num1; 
          st.push(""+result); 
         } 
         else if("X".equals(s[i])) 
         { 
          num1 = Integer.parseInt(st.pop(), 16); 
          num2 = Integer.parseInt(st.pop(), 16); 

          result=num1^num2; 
          st.push(""+result); 
         } 

         i++; 

        } 



       } 
       while(st.size()!=1); 

       result=Integer.parseInt(st.pop(),16); 
       System.out.println(result); 
      } 




     } 
     catch(IOException e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

請給我一個解決方案。

謝謝。

+0

你似乎在讀你的十六進制輸入,但在基數爲10(十進制)輸出你的答案... – initramfs

回答

0

的問題,當你做

st.push(""+result); 

此代碼基本上是一個整數轉換成它的基數爲10號,然後將其轉換成字符串所在。由於你的循環機制,當這個結果被Integer.parseString(st.pop(),16)重新解析時,它被錯誤地讀取(當它是一個以10爲底數的整數時,它是一個以16爲基數的整數)。

替換這一切您st.push()引用,然後再試一次:

st.push(Integer.toString(result, 16));