2012-04-17 12 views
5

Ich versuche eine Basis 10 Zahl in eine beliebige Basis zu konvertieren, indem ich die Konvertierung benutze. Im Moment ist dies der Code, den ich mir ausgedacht habe. Ich habe das traurige Gefühl, dass dies völlig falsch ist. Das Bild unten ist ein Beispiel dafür, wie dieser Prozess stattfinden sollte.Java - Rekursionsprogramm - Konvertiere eine Basis 10 Nummer in eine beliebige Basis

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

Ist das Hausaufgaben? Wenn ja, sollte es mit dem Tag [homework] gekennzeichnet werden. –

+0

sollten Sie einen Basisfall definieren, sagen wir, wenn Ihre Zahl kleiner als Ihre Basis ist, und den rekursiven Teil, sagen wir, die Operationen, um die nächste Ziffer Ihrer konvertierten Zahl –

+0

Dank für die Heads-Up-Louis ... und danke auch luiggi, IDK, warum ich dachte, == 0 war eine gute Idee. Ich glaube nicht, dass das jetzt auch nötig ist, wenn ich es mir anschaue. – user878034

Antwort

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); 
     } 
    } 
} 

Diese von Base 2 zur Basis konvertieren 36, obwohl Sie es durch weitere Symbole hinzugefügt erweitern könnte.

+0

Vielen Dank! Sehr hilfreich! – user878034

2

Wenn Sie nur versuchen, Basen zu konvertieren (wie auf Basis 2), versuchen Sie den folgenden Code ein:

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

Für speziell stützen 2:

Integer.parseInt(Integer.toBinaryString(numberToConvert))

Integer andere enthält Methoden wie toHexString, die verwendet werden können. Diese nehmen an, dass numberToConvert in Basis 10 ist.

+0

Clevere Lösung! –

10

Ich habe gerade fertig mit diesem Problem für eine comp sci-Klasse. Ich hatte diese rekursiv zu lösen:

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

Ich denke, wir lernten aus dem gleichen Buch. Genau das habe ich gebraucht! –

3

Ich fühle mich nicht wie ein ganzes Programm zu schreiben, aber ich denke, der schnelle Weg, es in Java, dies zu tun ist:

Integer.toString(int i,int radix); 

Zum Beispiel

Integer.toString(255,2) 

würde "11111111" zurückgeben. Ich bin mir nicht sicher, ob Sie nur nach einer schnellen Lösung suchen oder die Konvertierungsmethode selbst implementieren möchten. Dies wäre eine schnelle Lösung. Siehe diesen Beitrag: What is the method in the API for converting between bases?

+0

Das zweite Argument wird jedoch standardmäßig auf 10 gesetzt, wenn>> Character.MAX_RADIX' angegeben wird, was normalerweise 36 (10 für 0-9, 26 für Alphabet) für das zweite Argument ist. – 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); 
     } 
    } 

} 
Verwandte Themen