Помогите разобраться с переводом из х сс в 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;
}
}