Как мне сделать модуль в С++?

Как выполнить операцию модификации между двумя целыми числами в С++?


person user161190    schedule 05.04.2010    source источник
comment
Есть ли термин для сообщения, где поиск в Google заголовка дает ответ?   -  person msw    schedule 06.04.2010
comment
И... нажмите здесь, если вы не возражаете против того, чтобы stackoverflow был основным ресурсом, даже для простых вопросов.   -  person Greg M. Krsak    schedule 05.02.2013


Ответы (6)


Вот так: х=у%г

person Giffyguy    schedule 05.04.2010
comment
За исключением того, что результат отрицательный для отрицательного дивиденда. - person Potatoswatter; 06.04.2010
comment
@ Картофельная кукуруза, может быть, а может и нет. Это определяется реализацией. - person wilhelmtell; 06.04.2010
comment
@wilhelmtell: 5.6/4: (a/b)*b + a%b равно a, поэтому округление до нуля (чрезвычайно популярная реализация, к лучшему или к худшему) подразумевает это, и это предписано C+ +0x. - person Potatoswatter; 06.04.2010
comment
Округление до нуля предписано c++0x, но не c++03. В обоих стандартах ваша формула должна быть верной, но знак a%b зависит от того, как реализовано целочисленное деление. Знак правильно определяется как неотрицательный, только если a и b оба неотрицательны. - person Dennis Zickefoose; 06.04.2010
comment
Реализация @Potatocorn. Определенный. - person wilhelmtell; 06.04.2010
comment
@ Деннис, знак четко определен как неотрицательный, только если a неотрицательный, а b положительный: p - person wilhelmtell; 06.04.2010
comment
В любом случае он не будет сопоставлять отрицательные целые числа с en.wikipedia.org/wiki/Modular_arithmetic модульное арифметическое кольцо. Если это так, вам очень повезло, и ваша программа очень непереносима. - person Potatoswatter; 06.04.2010

В С++ используйте оператор %

Дополнительная помощь

person Alex    schedule 05.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 является положительным значением, вызов вышеуказанной функции даст неотрицательный результат.

person wilhelmtell    schedule 05.04.2010
comment
Никто больше не упоминает, что %, по сути, является оператором остатка в C++, и не может обеспечить реализацию модуля, которая корректно обходит заданное отрицательное входное значение для a. Это лучший ответ. - person leetNightshade; 20.09.2012

Как указывалось в других ответах, вы можете использовать оператор С++ %. Но имейте в виду, что есть нюанс, о котором еще никто не упомянул: что, если в выражении a % b a отрицательное? Должен ли результат этой операции быть положительным или отрицательным? Стандарт С++ оставляет это на усмотрение реализации. Поэтому, если вы хотите переносимо обрабатывать отрицательные входные данные, вам, вероятно, следует сделать что-то вроде r = abs(a) % b, а затем исправить знак r в соответствии с вашими требованиями.

person Jim Lewis    schedule 05.04.2010
comment
Это предполагает, что вы хотите, чтобы подразумеваемая операция div была округлена до нуля. Если вы хотите округлить до отрицательной бесконечности, вам понадобится r = (unsigned(a) + offset * b) % b, где offset достаточно велико, чтобы a + offset * b всегда было положительным. - person Mike DeSimone; 06.04.2010

Используя оператор модуля %:

int modulus_a_b = a % b;
person Klaim    schedule 05.04.2010
comment
a и b — целые числа... так почему же double? modulus_a_b должен быть того же типа, что и a и b. - person Mike DeSimone; 06.04.2010
comment
@Mike: ну, a % b будет либо int, либо того же типа, что и по крайней мере один из a и b. Таким образом, у вас есть несколько вариантов типа modulus_a_b, в зависимости от контекста :-) - person Steve Jessop; 06.04.2010
comment
@Steve: Но только один из этих вариантов — это тип, который возвращает оператор %. Все остальные подразумевают приведение типов, э-э, static_cast<>. double, безусловно, один из последних. Кроме того, использование double означает использование самой медленной доступной математики (если нет типа long double, не дай бог)... - person Mike DeSimone; 06.04.2010
comment
Причина, по которой я сказал о большом выборе, заключается в том, что, например, результатом short % short является int, а не short, но в зависимости от контекста, вероятно, имеет смысл использовать его как short. Таким образом, возникает конфликт между тем же типом, что и a и b, и отсутствием неявного преобразования. - person Steve Jessop; 06.04.2010

если вы используете двойную переменную, вы должны использовать;

double x;
double y;
double result = fmod(x, y);
person ErdeNese    schedule 02.05.2012