В вашем коде происходят две вещи. Первая: из числа извлекаются цифры в восьмеричной системе счисления:
- 15450 = 8 · 1931 + 2;
- 1931 = 8 · 241 + 3;
- 241 = 8 · 30 + 1;
- 30 = 8 · 3 + 6;
- 3 = 8 · 0 + 3.
Выделенные цифры образуют восьмеричное представления числа: 1545010 = 361328.
Вторая вещь: восьмеричные цифры умножаются на степени десятки: 3·104 + 6·103 + 1·102 + 3·101 + 2·100 = 3613210.
Полученное десятичное число выглядит на печати как восьмеричное. Получился нужный результат - программа напечатала восьмеричное представление десятичного числа.
Это плохой способ из-за переполнения. 100000000010 = 73465450008. Но 734654500010 > 214748364710 = 231 - 1 - максимальное значение int
. Во время печати произойдёт переполнение, вы получите чепуху.
То что задействована вещественная арифметика тоже программу не красит.
Это рабочий, корявый, избыточный способ печатать небольшие целые числа в восьмеричном формате.
Рабочее решение (одно из) состоит в том чтобы накопить цифры в буфере, развернуть буфер задом-наперёд и напечатать. Никаких переполнений и загадочных вещественных вычислений:
int decimal = 15450;
StringBuilder sb = new StringBuilder();
for (int n = decimal; n > 0; n /= 8) {
sb.append(n % 8);
}
if (sb.length() == 0) {
sb.append(0);
}
System.out.println(sb.reverse());