сегодня вечером мне любопытно насчет отрицательного числа по модулю в математике.
Независимо от языка программирования, калькуляторы при этом возвращают разные значения, которые зависят от собственной формулы, лежащей в основе, какой правильный ответ, если на ЕГЭ в младших классах есть такие вопросы:
-7 mod 2 = ?
7 mod -2 = ?
-7 mod -2 = ?
PS: извините, если я слишком стар, чтобы помнить ответы на эти «основные вопросы», и спасибо за вашу доброту, чтобы дать мне правильный ответ!
ps2: людям, которые посвящают этот вопрос: поверьте мне, этот вопрос действительно полезен, по крайней мере, он может помочь вам понять, почему этот блок кода не работает:
function isEvenOrOdd(num) {
return num % 2 === 1 ?'odd' : 'even';
}
isEvenOrOdd(5); // 'odd'
isEvenOrOdd(18); // 'even'
isEvenOrOdd(0); // 'even'
isEvenOrOdd(-7); // 'even'
@JohanC да, Йохан, я делал это все время, пока мой стажер не сделал num % 2 !== 1, я понял, что модуль в программировании может быть отрицательным :)! Тогда этот вопрос был задан.
Чтобы вычислить x mod m, где x отрицательно, вам нужно продолжать добавлять m к x, пока он не станет неотрицательным, поэтому -7% 2 = -7 + 2 + 2 + 2 + 2 = 1.
Чтобы проверить, является ли число нечетным или четным, всегда делайте это в абсолютном значении, например |x| mod m, поэтому вам не нужно беспокоиться об отрицательном значении по модулю.
просто перепроверьте, вы имеете в виду, что результат -7 % 2 равен -4 modulus 1
или я ошибаюсь?
В математике модуль должен быть> 1, и соглашение состоит в том, что операция по модулю дает наименьшее неотрицательное целочисленное решение a+km=b
:
-7 mod 2 = 1
7 mod -2 Illegal
-7 mod -2 Illegal
Легко расширить определение, включив в него отрицательные числа (и 1, и -1):
-7 mod 2 = 1
7 mod -2 = 1
-7 mod -2 = 1
-7 mod 3 = 2
Но в вычислениях разные языки используют разные соглашения:
-7 mod 2 = {1, or -1, or undefined}
Я подозреваю, что ваша система говорит -7 mod 2 = -1
, так что isEvenOrOdd(-7);
дает «четный» (потому что -1 ≠ 1).
спасибо вам за ваш ответ! вот это мне интересно! Кстати, не могли бы вы немного просветить меня о результате -7 по модулю 2: должно ли это быть -4 по модулю 1 или -3 по модулю 1?
@Kai: я не понимаю твоего вопроса. Вы спрашиваете меня о -7 mod 1
?
О, я просто хочу спросить результат -7 / 2 = ?? . Для положительного числа это 7/2 = 3 по модулю 1 (3 * 2 + 1 = 7).
@Kai: модуль - это делитель, а не остаток. Математически -7 по модулю 2 = 1 (потому что -7 = (-4)*2+1). Некоторые компьютерные системы делают это, а некоторые говорят, что -7 по модулю 2 = -1 (потому что -7 = (-3)*2 + (-1)).
Безопаснее сравнивать с нулем:
return num % 2 !== 0 ?'odd' : 'even'; }