Как выполнить операцию модификации между двумя целыми числами в С++?
Как мне сделать модуль в С++?
Ответы (6)
Вот так: х=у%г
a%b
зависит от того, как реализовано целочисленное деление. Знак правильно определяется как неотрицательный, только если a
и b
оба неотрицательны.
- person Dennis Zickefoose; 06.04.2010
a
неотрицательный, а b
положительный: p
- person wilhelmtell; 06.04.2010
C++ имеет оператор %
, который иногда ошибочно называют оператором модуля. В частности, STL имеет функтор modulus<>
в заголовке <functional>
. Заметьте, это не оператор математического модуля, потому что в модульной арифметике a mod b
по определению дает неотрицательное значение для любого значения a
и любого положительного значения b
. В C++ знак результата a % b
определяется реализацией, если любой из аргументов отрицательный. Таким образом, нам более уместно назвать оператор %
оператором remainder.
Тем не менее, если вам действительно нужен оператор математического модуля, вы можете определить функцию, которая делает именно это:
template<typename V>
V mod(const V& a, const V& b)
{
return (a % b + b) % b;
}
Пока b
является положительным значением, вызов вышеуказанной функции даст неотрицательный результат.
Как указывалось в других ответах, вы можете использовать оператор С++ %. Но имейте в виду, что есть нюанс, о котором еще никто не упомянул: что, если в выражении a % b
a
отрицательное? Должен ли результат этой операции быть положительным или отрицательным? Стандарт С++ оставляет это на усмотрение реализации. Поэтому, если вы хотите переносимо обрабатывать отрицательные входные данные, вам, вероятно, следует сделать что-то вроде r = abs(a) % b
, а затем исправить знак r
в соответствии с вашими требованиями.
div
была округлена до нуля. Если вы хотите округлить до отрицательной бесконечности, вам понадобится r = (unsigned(a) + offset * b) % b
, где offset
достаточно велико, чтобы a + offset * b
всегда было положительным.
- person Mike DeSimone; 06.04.2010
Используя оператор модуля %
:
int modulus_a_b = a % b;
a
и b
— целые числа... так почему же double
? modulus_a_b
должен быть того же типа, что и a
и b
.
- person Mike DeSimone; 06.04.2010
a % b
будет либо int
, либо того же типа, что и по крайней мере один из a
и b
. Таким образом, у вас есть несколько вариантов типа modulus_a_b
, в зависимости от контекста :-)
- person Steve Jessop; 06.04.2010
%
. Все остальные подразумевают приведение типов, э-э, static_cast<>
. double
, безусловно, один из последних. Кроме того, использование double
означает использование самой медленной доступной математики (если нет типа long double
, не дай бог)...
- person Mike DeSimone; 06.04.2010
short % short
является int
, а не short
, но в зависимости от контекста, вероятно, имеет смысл использовать его как short
. Таким образом, возникает конфликт между тем же типом, что и a и b, и отсутствием неявного преобразования.
- person Steve Jessop; 06.04.2010
если вы используете двойную переменную, вы должны использовать;
double x;
double y;
double result = fmod(x, y);