Рубрики
Без рубрики

Примеры модов Java

– Примеры Java-модов

Как остаток, так и по модулю являются двумя аналогичными операциями; они действуют одинаково, когда числа положительные, но сильно отличаются, когда числа отрицательные. В Java мы можем использовать Math.floormod() для описания операции по модулю (или модулю) и % оператор для операции остатка.

Посмотрите на результат:

| rem & +divisor| rem & -divisor | mod & +divisor | mod & -divisor |
| :-------------| :------------- | :------------- | :--------------|
| -5 rem 3 = -2 | -5 rem -3 = -2 | -5 mod 3 =  1  | -5 mod -3 = -2 |
| -4 rem 3 = -1 | -4 rem -3 = -1 | -4 mod 3 =  2  | -4 mod -3 = -1 |
| -3 rem 3 =  0 | -3 rem -3 =  0 | -3 mod 3 =  0  | -3 mod -3 =  0 |
| -2 rem 3 = -2 | -2 rem -3 = -2 | -2 mod 3 =  1  | -2 mod -3 = -2 |
| -1 rem 3 = -1 | -1 rem -3 = -1 | -1 mod 3 =  2  | -1 mod -3 = -1 |
|  0 rem 3 =  0 |  0 rem -3 =  0 |  0 mod 3 =  0  |  0 mod -3 =  0 |
|  1 rem 3 =  1 |  1 rem -3 =  1 |  1 mod 3 =  1  |  1 mod -3 = -2 |
|  2 rem 3 =  2 |  2 rem -3 =  2 |  2 mod 3 =  2  |  2 mod -3 = -1 |
|  3 rem 3 =  0 |  3 rem -3 =  0 |  3 mod 3 =  0  |  3 mod -3 =  0 |
|  4 rem 3 =  1 |  4 rem -3 =  1 |  4 mod 3 =  1  |  4 mod -3 = -2 |
|  5 rem 3 =  2 |  5 rem -3 =  2 |  5 mod 3 =  2  |  5 mod -3 = -1 |

В двух словах:

  • `Результат остатка имеет тот же знак (+ или -), что и дивиденд (первый операнд).
  • `Результат по модулю имеет тот же знак (+ или -), что и делитель (второй операнд).

**Дальнейшее чтение – ** Википедия – Операция по модулю

1. Остаток по модулю

1.1 Оператор остатка %

dividend rem divisor = remainder

8 % 3 = 2

dividend(8) rem(%) divisor(3) = remainder(2)

Давайте рассмотрим пример для печати каждого остатка от делимого -10 до 10 и делителя 3.

package com.mkyong;

import java.util.Arrays;
import java.util.List;

public class JavaModExample1 {

    public static void main(String[] args) {

        int divisor = 3;

        List list = Arrays.asList(-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        String format = "%3d rem %1d = %2d";
        for (Integer dividend : list) {
            String result = String.format(format, dividend, divisor, dividend % divisor);
            System.out.println(result);
        }

    }

}

Выход

-10 rem 3 = -1
 -9 rem 3 =  0
 -8 rem 3 = -2
 -7 rem 3 = -1
 -6 rem 3 =  0
 -5 rem 3 = -2
 -4 rem 3 = -1
 -3 rem 3 =  0
 -2 rem 3 = -2
 -1 rem 3 = -1
  0 rem 3 =  0
  1 rem 3 =  1
  2 rem 3 =  2
  3 rem 3 =  0
  4 rem 3 =  1
  5 rem 3 =  2
  6 rem 3 =  0
  7 rem 3 =  1
  8 rem 3 =  2
  9 rem 3 =  0
 10 rem 3 =  1

Для делителя = -3

-10 rem -3 = -1
 -9 rem -3 =  0
 -8 rem -3 = -2
 -7 rem -3 = -1
 -6 rem -3 =  0
 -5 rem -3 = -2
 -4 rem -3 = -1
 -3 rem -3 =  0
 -2 rem -3 = -2
 -1 rem -3 = -1
  0 rem -3 =  0
  1 rem -3 =  1
  2 rem -3 =  2
  3 rem -3 =  0
  4 rem -3 =  1
  5 rem -3 =  2
  6 rem -3 =  0
  7 rem -3 =  1
  8 rem -3 =  2
  9 rem -3 =  0
 10 rem -3 =  1

С остатком % , результат имеет тот же знак, что и дивиденд (первый операнд).

1.2 По модулю с Math.floormod

dividend mod divisor = modulus

8 mod 3 = 2

Math.floorMod(8, 2) = 2

dividend(8) mod(%) divisor(3) = modulus(2)

Давайте рассмотрим пример для вывода каждого по модулю от делимого -10 до 10 и делителя 3.

package com.mkyong;

import java.util.Arrays;
import java.util.List;

public class JavaModExample2 {

    public static void main(String[] args) {

        int divisor = 3;

        List list = Arrays.asList(-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        String format = "%3d mod %1d = %2d";
        for (Integer dividend : list) {
            String result = String.format(format, dividend, divisor, Math.floorMod(dividend,divisor));
            System.out.println(result);
        }

    }

}

Выход

-10 mod 3 =  2
 -9 mod 3 =  0
 -8 mod 3 =  1
 -7 mod 3 =  2
 -6 mod 3 =  0
 -5 mod 3 =  1
 -4 mod 3 =  2
 -3 mod 3 =  0
 -2 mod 3 =  1
 -1 mod 3 =  2
  0 mod 3 =  0
  1 mod 3 =  1
  2 mod 3 =  2
  3 mod 3 =  0
  4 mod 3 =  1
  5 mod 3 =  2
  6 mod 3 =  0
  7 mod 3 =  1
  8 mod 3 =  2
  9 mod 3 =  0
 10 mod 3 =  1

Для делителя = -3

-10 mod -3 = -1
 -9 mod -3 =  0
 -8 mod -3 = -2
 -7 mod -3 = -1
 -6 mod -3 =  0
 -5 mod -3 = -2
 -4 mod -3 = -1
 -3 mod -3 =  0
 -2 mod -3 = -2
 -1 mod -3 = -1
  0 mod -3 =  0
  1 mod -3 = -2
  2 mod -3 = -1
  3 mod -3 =  0
  4 mod -3 = -2
  5 mod -3 = -1
  6 mod -3 =  0
  7 mod -3 = -2
  8 mod -3 = -1
  9 mod -3 =  0
 10 mod -3 = -2

При делении по модулю результат имеет тот же знак, что и делитель (второй операнд).

2. Распространенные подводные камни – Находите нечетные числа.

В этом примере используется % остаток, чтобы проверить, является ли данное число нечетным числом. Для отрицательных чисел это может привести к неожиданным результатам.

package com.mkyong;

import java.util.Arrays;
import java.util.List;

public class JavaModExample3 {

    public static void main(String[] args) {

        int divisor = 2;
        List list = Arrays.asList(-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        String format = "%3d %% %2d = %2d, isOdd() = %6b";
        for (Integer dividend : list) {
            String result = String.format(format, dividend, divisor, dividend % divisor, isOdd(dividend));
            System.out.println(result);
        }

    }

    // How about negative numbers?
    private static boolean isOdd(int number) {
        return number % 2 == 1;
    }

}

Выход

-10 %  2 =  0, isOdd() =  false
 -9 %  2 = -1, isOdd() =  false
 -8 %  2 =  0, isOdd() =  false
 -7 %  2 = -1, isOdd() =  false
 -6 %  2 =  0, isOdd() =  false
 -5 %  2 = -1, isOdd() =  false
 -4 %  2 =  0, isOdd() =  false
 -3 %  2 = -1, isOdd() =  false
 -2 %  2 =  0, isOdd() =  false
 -1 %  2 = -1, isOdd() =  false
  0 %  2 =  0, isOdd() =  false
  1 %  2 =  1, isOdd() =   true
  2 %  2 =  0, isOdd() =  false
  3 %  2 =  1, isOdd() =   true
  4 %  2 =  0, isOdd() =  false
  5 %  2 =  1, isOdd() =   true
  6 %  2 =  0, isOdd() =  false
  7 %  2 =  1, isOdd() =   true
  8 %  2 =  0, isOdd() =  false
  9 %  2 =  1, isOdd() =   true
 10 %  2 =  0, isOdd() =  false

Для оператора % остаток результат имеет знак (+или -) дивидендов (первый операнд). Например -3 % 2 = -1 , , приведенное выше нечетно() вернет ложь

Одним из возможных ответов является проверка, если остаток не равен нулю (0 не имеет знака (+ или -)).

  private static boolean isOdd(int number) {
        return number % 2 != 0;
    }

Выход

-10 %  2 =  0, isOdd() =  false
 -9 %  2 = -1, isOdd() =   true
 -8 %  2 =  0, isOdd() =  false
 -7 %  2 = -1, isOdd() =   true
 -6 %  2 =  0, isOdd() =  false
 -5 %  2 = -1, isOdd() =   true
 -4 %  2 =  0, isOdd() =  false
 -3 %  2 = -1, isOdd() =   true
 -2 %  2 =  0, isOdd() =  false
 -1 %  2 = -1, isOdd() =   true
  0 %  2 =  0, isOdd() =  false
  1 %  2 =  1, isOdd() =   true
  2 %  2 =  0, isOdd() =  false
  3 %  2 =  1, isOdd() =   true
  4 %  2 =  0, isOdd() =  false
  5 %  2 =  1, isOdd() =   true
  6 %  2 =  0, isOdd() =  false
  7 %  2 =  1, isOdd() =   true
  8 %  2 =  0, isOdd() =  false
  9 %  2 =  1, isOdd() =   true
 10 %  2 =  0, isOdd() =  false

Рекомендации

Оригинал: “https://mkyong.com/java/java-mod-examples/”