Помогите разобраться с переводом из х сс в y сс

помогите пожалуйста разобраться. Суть заключается в том, что сначала реализуется перевод в десятичную сс , а потом в любую другую путем деления и получения остатка. К примеру на вход подаётся 1111 в 2-ичной сс, сначала переводим в 10 сс, а потом уже в ту которую указал пользователь. В данном куске кода при вводе исходных данных 1111 в 2-ичной сс, и переводе в 8, выдаёт результат 4955. Как это исправить?

 public static void main(String[] args) {         
 char[] numb = new char [] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j'}; 
        int chis_10=0;
        int st = 0; // степень
        int baseNumber;
        int userNumberBase;
        
        System.out.print("Введите исходное число: ");
        Scanner scan = new Scanner(System.in);
        String chis = scan.nextLine();
        char[] chars = chis.toCharArray(); // преобразуем строку в char  и загоняем посимвольно  в массив
        System.out.print("Введите основание исходного числа: ");
        baseNumber = scan.nextInt();
        System.out.print("Введите основание системы в которую вы хотите перевести: ");
        userNumberBase = scan.nextInt();
        for ( int i = chis.length() - 1 ; i>=0; i--){
            for(int j = 0; j<20;j++)// цикл по массиву
            {
                if(chars[i]== numb[j])
                {
                    chis_10 += (int)(j*Math.pow(baseNumber, st));
                    st++;
                    break;
                }
            }
        }
        
        // перевод числа в нужную степень путем взятия остатка
        String res = "";
        while (chis_10!=0)
        {
            res = Integer.toString(numb[chis_10 % userNumberBase])+res;
            chis_10 = chis_10 / userNumberBase;
        }
        System.out.println("Результат перевода: " + res);
    
}

Ответы (1 шт):

Автор решения: Дмитрий

Ошибка при приведении char к int. Вам не нужно этого делать, ведь char по сути и есть int и вы грубо говоря получаете порядковый номер символа, а не сам символ. Чтобы исправить это получайте из char не int, а String. Для этого замените это

res = Integer.toString(numb[chis_10 % userNumberBase])+res;

на это

res = Character.toString(numb[chis_10 % userNumberBase]) + res;

а еще лучше использовать StringBuilder :

StringBuilder sb = new StringBuilder();
do sb.insert(0, numb[chis_10 % userNumberBase]);
while ((chis_10/=userNumberBase) != 0);

А еще лучше сделать рефкторинг и привести код хотя бы к такому виду (а то, к примеру, переменная с именем chis_10 создает впечатление, что вы продаете 10 кг сыра,но не знаете, как правильно пишется сыр на английском):

import java.util.Scanner;

public class ConverterNotation {
    
    private final static char[] NUMBER_MAPPING = 
        {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};

    public static void main(String[] args) {        
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введите исходное число: ");        
        String number = scanner.nextLine();
        System.out.print("Введите основание исходного числа: ");
        int decimalNumber = toDecimalNumber(number, scanner.nextInt());
        System.out.print("Введите основание системы в которую вы хотите перевести: ");
        String result = fromDecimalNumber(decimalNumber, scanner.nextInt());        
        System.out.println("Результат перевода: " + result);
    }
    
    private static String fromDecimalNumber(int decimalNumber, int targetBaseNumber) {
        final StringBuilder sb = new StringBuilder();
        do sb.insert(0, NUMBER_MAPPING[decimalNumber % targetBaseNumber]);
        while ((decimalNumber/=targetBaseNumber) != 0);
        return sb.toString();
    }
    
    private static int toDecimalNumber(String number, int sourceBaseNumber) {
        int decimalNumber = 0, pow = 0;
        final char[] chars = number.toCharArray();
        for (int i = chars.length - 1; i >= 0; i--) {
            for (int j = 0; j < NUMBER_MAPPING.length; j++) {
                if (chars[i] == NUMBER_MAPPING[j]) {
                    decimalNumber += j * Math.pow(sourceBaseNumber, pow++);
                    break;
                }
            }
        }
        return decimalNumber;
    }
    
}
→ Ссылка