Было бы здорово, если бы кто-то мог дать мне правильное объяснение кода :)

Код работает, и мне нравится, однако, когда я изучаю Java, нужно понимать каждый его кусочек.

Благодарность!

Проверено StringBuilder() - кажется, хорошо Однако часть внутри loop не совсем понятна.


    public class SquareDigit {

        public int squareDigits(int n) {
               StringBuilder builder = new StringBuilder();

               while(n > 0) {
                   int digit = n % 10;

                   int square = digit * digit;
                   builder.insert(0, square);

                   n = Math.floorDiv(n, 10);
               }

               return Integer.valueOf(builder.toString());
         }

     }

-2
Martynas Šileikis 8 Ноя 2019 в 13:21

2 ответа

Лучший ответ
while(n > 0) {

Хотя int n больше 0, сделайте следующее.

int digit = n % 10;

Новый int digit инициализируется как n MODULO 10. Modulo возвращает остаток от деления n / 10. Так, например, если n равно 21, он вернет 1.

int square = digit * digit;
builder.insert(0, square);

Новый int square инициализируется как произведение времен digit. Метод insert() из класса StringBuilder вызывается с 0 и square в качестве параметров. 0 - это смещение, а square - это значение символа для вставки.

n = Math.floorDiv(n, 10);

Math.floorDiv() возвращает наибольшее (ближайшее к положительной бесконечности) целочисленное значение, которое меньше или равно алгебраическому коэффициенту. Например, Math.floorDiv(25, 5) вернет 5.

return Integer.valueOf(builder.toString());

Наконец, вы возвращаете значение, которое вы создали ранее. builder.toString() возвращает объект StringBuilder в виде строки. Integer.valueOf(String str) используется для возврата объекта Integer, содержащего значение указанного String str.

1
yur 8 Ноя 2019 в 10:36

Давайте возьмем n=25. После передачи значения в squareDigits(int 25).

1) Сначала создается StringBuilder.

2) while(n > 0): 25> 0 истинно, поэтому он удовлетворяет условию входа в цикл.

3) int digit = n % 10: n = 5.

4) int square = digit * digit: квадрат = 25.

5) builder.insert(0,square): вставляет значение square в 0-й позиции в builder.

6 ) n = Math.floorDiv(n, 10); : Math.floorDiv(int x,int y) возвращает наибольшее (ближайшее к положительной бесконечности) целочисленное значение, которое меньше или равно алгебраическому коэффициенту. п = 2.

7) Повторяет шаг 2 со значением 2. digit становится 2, square становится 4, builder вставляет значение 4, но 25 уже присутствует, поэтому самое последнее значение 4 добавляется к 25 ,

8) n становится Math.floorDiv(2, 10), который возвращает 0.2. При проверке условия while оно не удовлетворяет уравнению.

9) builder преобразуется в строку с помощью toString() и с помощью Integer.parseInt() преобразует возвращаемое значение строки в целое число, которое в итоге возвращает 425.

0
yur 8 Ноя 2019 в 12:21