2013-10-26 3 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), он читается некорректно (в качестве целочисленного значения base-16, когда его целое число -10).

Заменить все ссылки ваш st.push() с этим и попробуйте еще раз:

st.push(Integer.toString(result, 16)); 
Смежные вопросы