Может кто-нибудь объяснить мне, как работает оператор %
: Что это такое? Какова логика этого оператора? Что он делает и что он возвращает?
Например, следующий код на Java (хотя он будет работать и на других языках с похожими обозначениями):
char calculaLetra(int dni)
{
String juegoCaracteres="TRWAGMYFPDXBNJZSQVHLCKE";
int modulo= dni % 23;
char letra = juegoCaracteres.charAt(modulo);
return letra;
}
[Вопрос поднят в чате SO .]
Оператор
%
называется оператором модуля.Хорошее простое определение можно найти в документации для этого оператора в C# :
Например, допустим, вы вычисляете следующее деление:
Очевидно, что результат равен
3.333333....
или, другими словами,3
с остатком1
. Этот остаток является результатом использования оператора по модулю:Хотя я точно не знаю, как разные языки выполняют этот оператор внутри, эквивалентный способ выразить его на этих языках:
Когда полезно использовать этот оператор?
Этот оператор имеет множество применений.
Это может быть полезно, когда у вас есть любое целое число, и вам нужно преобразовать его в целое число с меньшим интервалом. Хеш-таблицы используют этот метод внутри. Например, начиная с положительного целого числа
n
, вам нужно вернуть целое число между1
и5
. Этого можно добиться следующим образом:Другой типичный пример — когда вы хотите узнать, является ли целое число четным или нечетным:
Как вам сказали в других ответах, он возвращает остаток от деления.
Я хотел сказать вам, что очень частым применением этого оператора является разделение массивов на равные группы с помощью циклов for. Один случай уже упоминался в других четных/нечетных ответах, то есть в группах по два человека. Но это можно распространить на группы по 3, 4... Например, нам нужно сделать колоду из 40 карт и инициализировать все их значения. В цикле от 0 до 39 деление i / 4 даст нам такой ряд: 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3... до 9. А модуль i % 4 дает нам дадут такой ряд: 0 1 2 3 0 1 2 3 0 1 2 3... Эти значения позволяют нам создавать карты (номинал, масть):
Вот пример кода на C#:
Оператор % возвращает остаток от деления между делимым (тот, что слева от оператора) и делителем (тот, что справа).
Разница с оператором /, который возвращает частное
В вашем примере он делит идентификационный номер на 23 и дает вам остаток, который остается до следующего точного деления на 23 (пример 24% 23 = 1).
С этим числом выберите букву, которая соответствует той,
array
которая уjuegoCaracteres
вас есть.Оператор
%
является арифметическим оператором и представляет собой деление на целые числа.Например, если вы разделите
10/3
это обычно, это = 3,33333334, с помощью%
программирования вы получите 1 в качестве ответа на это деление, почему?Ваш оставшийся 1 в отличие от результата обычного деления. То, что возвращает этот оператор, является остатком от этого деления! Есть случаи, когда мы хотели бы знать, например, четные числа, нас интересует не то, сколько раз одно число можно разделить на другое, а точный результат.
Наш остаток,
0
таким образом, если это четное число, поскольку нет остатка, с которым мы не могли бы справиться.В вашем конкретном случае вам нужно знать остаток от деления, чтобы получить char внутри вашей строки.
с оператором
/
деления : например6/4=1
, в отличие от оператора%
, вы получаете остаток от деления, например6%4=2
Это может быть не совсем правильно на бумаге и карандаше. Посмотрите внимательно на математическую операцию, она дает вам 0 в качестве ответа.
Легче, если вы рассматриваете его как дробное число. Делимое
n1
,(n1/n2)
частное иn2
делитель.Вы отменяете
n2
, и вы остаетесьВодить машину
Следовательно, он НЕ эквивалентен типу данных с плавающей запятой или карандашом и бумагой. Функция модуля возникает, когда в частном встречается целое число, в случае с языком, когда оно форматируется в целочисленный тип данных, как это делает sstan, то есть в этой точке деления возвращается остаток. Если включены все конечные или бесконечные десятичные дроби частного, модуль всегда будет равен 0.
Но это правильно. Я понимаю сстана и тени. Результатом моего модуля будет округление частного до целочисленного значения. Пример, равный или похожий на sstan, который работает: