2012-04-17 2 views
5

Я пытаюсь преобразовать базовый номер 10 в любую базу с помощью преобразования. Прямо сейчас это код, который я придумал. У меня печальное чувство, что это может быть совершенно неправильно. Ниже приведено изображение того, как этот процесс должен произойти.Java - программа рекурсии - преобразование базового номера 10 в любую базу

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

Это домашнее задание? Если это так, его следует пометить тегом [домашняя работа]. –

+0

, вы должны определить базовый случай, скажем, когда ваш номер меньше вашей базы, а рекурсивная часть, скажем, операции, чтобы получить следующую цифру вашего преобразованного номера –

+0

, спасибо за то, что у вас есть голова ... louis ... и спасибо, а также luiggi, Idk, почему я думал, что == 0 - хорошая идея. Я не думаю, что это даже необходимо сейчас, когда я смотрю на него – user878034

ответ

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

Это будет конвертировать из базы 2 до базы 36, хотя вы могли бы расширить его, добавив больше символов.

+0

Спасибо! Очень полезно! – user878034

2

Если вы просто пытаетесь конвертировать базы (например, на базе 2), попробуйте следующий код:

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

Для специально основывают 2:

Integer.parseInt(Integer.toBinaryString(numberToConvert))

Integer содержит другие такие методы, как toHexString, которые могут быть использованы. Они предполагают, что numberToConvert находится в базе 10.

+0

Умное решение! –

10

Я только что закончил эту проблему для класса comp sci. Я должен был решить эту проблему рекурсивно:

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

Я думаю, что мы учились в той же книге. Это именно то, что мне нужно! –

3

Я не чувствую, как писать целую программу, но я думаю, что быстрый способ сделать это в Java заключается в следующем:

Integer.toString(int i,int radix); 

Например,

Integer.toString(255,2) 

вернется «11111111». Я не уверен, что вы просто ищете быстрое решение или действительно хотите реализовать метод преобразования самостоятельно. Это было бы быстрым решением. Обратитесь к этому сообщению: What is the method in the API for converting between bases?

+0

Однако второй аргумент по умолчанию равен 10, если задано> 'Character.MAX_RADIX', которое обычно составляет 36 (10 для 0-9, 26 для алфавита) для второго аргумента. – 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); 
     } 
    } 

}