2012-04-17 8 views
5

Próbuję przekonwertować numer bazowy 10 na dowolną bazę przy użyciu konwersji. W tej chwili jest to kod, który wymyśliłem. Mam smutne uczucie, że może to być całkowicie błędne. Poniższy obrazek jest przykładem tego, jak powinien wyglądać ten proces.Java - Program rekursyjny - Konwertuj numer bazowy 10 na dowolną bazę

http://i854.photobucket.com/albums/ab107/tonytauart/rrrr.png

public static void main(String[] args) { 


    int base; 
    int number; 


    Scanner console = new Scanner(System.in); 

    System.out.println("Please enter the base"); 
     base = console.nextInt(); 
    System.out.println("Please enter the Number you would like to convert"); 
     number = console.nextInt(); 

     System.out.println(Converter(base, number)); 
} 


public static int Converter(int Nbase, int Nnumber){ 

    int answer; 
    int Rcontainer =0; 
    int cnt = 0; 
    int multiplier; 
    int temp; 
    double exp; 

    if(Nnumber/Nbase == 0){ 
     cnt++; 
     exp = Math.pow(10,cnt); 
     multiplier = (int)exp; 
     answer = (Nnumber%Nbase)* multiplier + Rcontainer; 


    } 
    else 
     { 
     exp = Math.pow(10,cnt); 
     multiplier = (int)exp; 
     cnt++; 
     temp = Rcontainer; 
     Rcontainer = (Nnumber%Nbase)* multiplier + temp; 

     Nnumber = Nnumber/Nbase; 
     answer = Converter(Nbase,Nnumber); 
     } 
     return answer; 
} 

}

+0

Czy to praca domowa? Jeśli tak, powinien być oznaczony tagiem [praca domowa]. –

+0

powinieneś zdefiniować podstawowy przypadek, powiedzmy, gdy twoja liczba jest mniejsza niż twoja baza, a część rekursywna, powiedzmy, operacje, aby uzyskać następną cyfrę twojego przekonwertowanego numeru –

+0

dzięki dla głów ludu ... i Dziękuję również Luiggi, Idk, dlaczego pomyślałem, że posiadanie == 0 było dobrym pomysłem. Nie sądzę, że jest to potrzebne nawet teraz, gdy na to patrzę. – user878034

Odpowiedz

9
public class Converter { 

    private static char symbols[] = new char[] { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T' }; 

    public static void main (String args[]) 
    { 
       Converter converter = new Converter(); 
     System.out.println(converter.convert (31, 16)); 
    } 

    public String convert (int number, int base) 
    { 
     return convert(number, base, 0, ""); 
    } 

    private String convert (int number, int base, int position, String result) 
    { 
     if (number < Math.pow(base, position + 1)) 
     { 
      return symbols[(number/(int)Math.pow(base, position))] + result; 
     } 
     else 
     { 
      int remainder = (number % (int)Math.pow(base, position + 1)); 
      return convert ( number - remainder, base, position + 1, symbols[remainder/(int)(Math.pow(base, position))] + result); 
     } 
    } 
} 

Będzie to przekonwertować z podstawy 2 do podstawy 36, chociaż można go rozwinąć dodając więcej symboli.

+0

Dziękujemy! Bardzo pomocne! – user878034

2

Jeśli tylko próbujesz konwertować bazy (jak do podstawy 2), spróbuj następujący kod:

Integer.parseInt(Integer.toString(numberToConvert,base))

Na specjalnie opierać 2:

Integer.parseInt(Integer.toBinaryString(numberToConvert))

Integer zawiera inne metody takie jak toHexString, które można wykorzystać. Zakładają one, że numberToConvert znajduje się w bazie 10.

+0

Sprytne rozwiązanie! –

10

Właśnie skończyłem robić ten problem dla klasy comp sci. Musiałem rozwiązać ten rekurencyjnie:

public static String convert(int number, int base) 
{ 
    int quotient = number/base; 
    int remainder = number % base; 

    if (quotient == 0) // base case 
    { 
     return Integer.toString(remainder);  
    } 
    else 
    { 
     return convert(quotient, base) + Integer.toString(remainder); 
    }    
} 
+1

Myślę, że uczymy się z tej samej książki. Właśnie tego potrzebowałem! –

3

Nie mam ochoty pisać cały program, ale myślę, że szybki sposób to zrobić w Javie jest taka:

Integer.toString(int i,int radix); 

Na przykład

Integer.toString(255,2) 

zwróci "11111111". Nie jestem pewien, czy szukasz tylko szybkiego rozwiązania, czy raczej chcesz sam wdrożyć metodę konwersji. To byłoby szybkie rozwiązanie. Zobacz ten post: What is the method in the API for converting between bases?

+0

Jednak drugi argument domyślnie przyjmuje wartość 10, jeśli podano> 'Character.MAX_RADIX', co zwykle wynosi 36 (10 dla 0-9, 26 dla alfabetu) dla drugiego argumentu. – Ryan

1
public class Converter { 

    private static char symbols[] = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 
        'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T' }; 

    public static void main(String args[]) { 
     Converter converter = new Converter(); 
     System.out.println(converter.convert(31, 16)); 
    } 

    public String convert(int number, int base) { 
     return convert(number, base, 0, ""); 
    } 

    private String convert(int number, int base, int position, String result) { 
     if (number < Math.pow(base, position + 1)) { 
      return symbols[(number/(int) Math.pow(base, position))] + result; 
     } else { 
      int remainder = (number % (int) Math.pow(base, position + 1)); 
      return convert(number - remainder, base, position + 1, symbols[remainder/(int) (Math.pow(base, position))] + result); 
     } 
    } 

}