如何使负数的模为正数? [重复]

问题描述 投票:0回答:6

基本上,我需要

(-3) % 5
为“2”而不是“-3”。 Python 生成“2”,而 C++ 生成“-3”。不知道如何在 C++ 中生成“2”。谢谢!

c++ modulo
6个回答
33
投票

最简单:

((x % 5) + 5) % 5


9
投票

如果输入数字

X
为负数,则添加底数:

X % Y + (X % Y < 0 ? Y : 0);

6
投票

快速而肮脏的方法是写作

((x % divisor) + divisor) % divisor

例如,

((-3 % 5) + 5) % 5 == 2
。然而,这执行两个单独的除法,并且由于除法是最慢的算术运算之一,您可能会喜欢以下替代方案之一:

(1) 通用

mod
对于整数或浮点

int mod(int x, int divisor)
{
    int m = x % divisor;
    return m + (m < 0 ? divisor : 0);
}

template<class Num> Num mod(Num x, Num divisor)
{
    Num m = x % divisor;
    return m + (m < 0 ? divisor : 0);
}

(2) 32 位整数的非分支

mod

int mod(int x, int divisor) { int m = x % divisor; return m + ((m >> 31) & divisor); }

所有这些都假设

divisor

 始终为正。


4
投票
您可以先将负数加上

5

 的倍数,将其转换为具有相同值 mod 5 的正数。

您可以通过取负数的绝对值,添加将其四舍五入到下一个 5 的倍数所需的任何内容,然后将其添加到您的负数中,这应该已经是 0 到 4 之间的数字了。

或者,只需执行以下操作:

num = -2; mod = 5; if ( num < 0 ) { result = mod - (abs(num) % mod); }

它会起作用(解释:

mathemagic


0
投票
int x=-3; // first approach cout<<((x % 5) + 5) % 5; //second approach means just reverse the number modNum%x cout<<5%x;
    

-2
投票
我看到很多关于 ((x % 5) + 5) % 5 的建议,但我只得到了相同的结果 (X+5)%5

(X + 除数) % 除数。

© www.soinside.com 2019 - 2024. All rights reserved.