2014-10-26 41 views
0

对于我的程序,我试图将数字从一个基地转换为另一个基地。然而,我想弄清楚为什么我不断收到ArrayOutOfBoundsException。谁能帮忙?我使用21作为数字,10作为原始基数,然后2作为新基数。ArrayOutOfBoundsException与基地转换

public static void main(String[] args) 
{ 
    Scanner input = new Scanner(System.in); 

    //Enter original number 
    System.out.println("Enter a number: "); 
    Double num = input.nextDouble(); 
    String orgNum = String.valueOf(num); 

    //Enter original base 
    System.out.println("Enter its base: "); 
    int b = input.nextInt(); 

    //Enter new base 
    System.out.println("Enter base to be converted to: "); 
    int a = input.nextInt(); 

    input.close(); 

    //Conversion 
    String newNum = convertBase(orgNum, b, a); 

    //New number 
    System.out.println("New Number: " + newNum); 
} 

public static String convertBase(String orgNum, int b, int a) 
{ 
    double value = 0; 
    double decDigit = 0; 
    char chDigit; 

    int length = orgNum.length(); 
    for (int p = 0; p < length; p ++) 
    { 
     chDigit = Character.toUpperCase(orgNum.charAt(length - 1 - p)); 

     if(Character.isLetter(chDigit)) 
     { 
      decDigit = chDigit - 'A' + 10; 
     } 
     else if (Character.isDigit(chDigit)) 
     { 
      decDigit = chDigit - '0'; 
     } 
     else 
     { 
      System.out.println("ERROR: Digit is unrecognizable."); 
     } 

     value += decDigit + Math.pow(b, p); 
    } 
    int D = 1; 
    for (D = 1; Math.pow(a, D) <= value; D++) {} 

    char[] newNum = new char[D]; 

    double pwr; 
    for (int p = D - 1; p >= 0; D--) 
    { 
     pwr = Math.pow(a, p); 
     decDigit = Math.floor(value/pwr); 
     value -= decDigit*pwr; 

     if (decDigit <= 9) 
     { 
      newNum[D - 1 - p] = (char) ('0' + (int)decDigit); 
     } 
     else 
     { 
      newNum[D - 1 - p] = (char) ('0' + (int)decDigit - 10); 
     }  
    } 
    return new String(newNum); 
} 
+1

您可以在代码中添加注释以获取异常吗? – kolonel 2014-10-27 00:00:50

+3

for(int p = D - 1; p> = 0; D--)这看起来很腥。不应该是(int p = D - 1; p> = 0; p--)? – Oncaphillis 2014-10-27 00:07:50

回答

0

有两个简单的错误,我已经看到了你的代码,

一)你应该使用nextInt代替nextDouble,并存储在一个基本整数类型的值;

//Enter original number 
System.out.println("Enter a number: "); 
//Double num = input.nextDouble(); 
int num = input.nextInt(); 
String orgNum = String.valueOf(num); 

b)代替D,你应该在这里减少p;

 double pwr; 
//  for (int p = D - 1; p >= 0; D--) 
     for (int p = D - 1; p >= 0; p--) 
     { 

我没有检查,如果输出是否有效,但下面的修改版本工作正常;

import java.util.Scanner; 

public class Test { 

    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 

     //Enter original number 
     System.out.println("Enter a number: "); 
//  Double num = input.nextDouble();   // #1: Convert to primitive integer 
     int num = input.nextInt(); 
     String orgNum = String.valueOf(num); 

     //Enter original base 
     System.out.println("Enter its base: "); 
     int b = input.nextInt(); 

     //Enter new base 
     System.out.println("Enter base to be converted to: "); 
     int a = input.nextInt(); 

     input.close(); 

     //Conversion 
     String newNum = convertBase(orgNum, b, a); 

     //New number 
     System.out.println("New Number: " + newNum); 
    } 

    public static String convertBase(String orgNum, int b, int a) 
    { 
     double value = 0; 
     double decDigit = 0; 
     char chDigit; 

     int length = orgNum.length(); 
     for (int p = 0; p < length; p ++) 
     { 
      chDigit = Character.toUpperCase(orgNum.charAt(length - 1 - p)); 

      if(Character.isLetter(chDigit)) 
      { 
       decDigit = chDigit - 'A' + 10; 
      } 
      else if (Character.isDigit(chDigit)) 
      { 
       decDigit = chDigit - '0'; 
      } 
      else 
      { 
       System.out.println("ERROR: Digit is unrecognizable."); 
      } 

      value += decDigit + Math.pow(b, p); 
     } 
     int D = 1; 
     for (D = 1; Math.pow(a, D) <= value; D++) {} 

     char[] newNum = new char[D]; 

     double pwr; 
//  for (int p = D - 1; p >= 0; D--) // #2: decrement the index p 
     for (int p = D - 1; p >= 0; p--) 
     { 
      pwr = Math.pow(a, p); 
      decDigit = Math.floor(value/pwr); 
      value -= decDigit*pwr; 

      if (decDigit <= 9) 
      { 
       newNum[D - 1 - p] = (char) ('0' + (int)decDigit); 
      } 
      else 
      { 
       newNum[D - 1 - p] = (char) ('0' + (int)decDigit - 10); 
      }  
     } 
     return new String(newNum); 
    } 

}