蟒蛇和C++模数
Python and C++ modulus
我正在学习 c++,在尝试编写一个小程序时,我发现了一些奇怪的东西。它是关于模数的: C++ 代码
cout << -325 - (-325 % 100) << endl;
// -300
cout << 325 - (325 % 100);
// 300
和蟒蛇代码
print(-325 - (-325 % 100))
# -400
print(325 - (325 % 100))
# 300
有人可以解释一下吗?太郎
这有点超出我的专业知识,但它的 python 可能遵循 Donald Knuth 余数计算,即:a + b*[a/b]
[]
地板操作。如下:
a = -325
b = 100
print(a - b*math.floor(a/b))
print(math.floor(-3.25))
print(-325 -(a - b*math.floor(a/b)))
结果在:
75
-4
-400
我有点惊讶C++没有返回相同的内容(但我对该主题也不够了解)。
编辑:快速搜索此主题并learncpp提到了C++的原因,特别是C++11,将地板操作标准化为0。我引用:
在 C++11 之前,如果整数除法的任一操作数是 负数,编译器可以自由向上或向下舍入!例如,-5/2 的计算结果可以是 -3 或 -2,具体取决于编译器的方式 轮。但是,大多数现代编译器会截断为 0(因此 -5/2 将等于 -2)。C++11 规范将其更改为显式 定义整数除法应始终截断为 0(或将 更简单地说,删除了分数分量)。
同样在 C++11 之前,如果模运算符的任一操作数是 负数,模量的结果可以是负数或 阳性!例如,-5 % 2 的计算结果可以是 1 或 -1。这 C++11 规范对此进行了收紧,以便 % b 始终解析为 A的标志。
关于Python,你可以看看divmod的文档,其中指出:
取两个(非复杂)数字作为参数并返回一对 使用整数时由其商和余数组成的数字 划分。对于混合操作数类型,二进制算术的规则 运算符适用。对于整数,结果与 (a//b, a % 对于浮点数,结果是 (q, a % b),其中 q 是 通常 math.floor(a/b),但可能比这少 1。无论如何 q * b + a % b 非常接近 a,如果 a % b 不为零,则具有相同的 符号为b,0 <= abs(a % b) <abs(b)>
编辑2:有关此主题的Python编程常见问题解答的更多信息。
为什么 -22//10 返回 -3?
这主要是由以下愿望驱动的:
i % j
与j
具有相同的符号。如果你想要那个,还想要:
i == (i // j) * j + (i % j)
然后整数除法必须返回 地板。C 还要求该标识成立,然后编译器 截断
i // j
需要使i % j
具有与i
相同的符号。当
j
为负值时,i % j
的实际用例很少。当j
积极的,有很多,而且几乎所有的都更多 对i % j
>= 0
很有用。如果时钟现在说 10,它说了什么 200小时前?-190 % 12 == 2
是有用的;-190 % 12 == -10
是一个错误 等着咬人。
看起来 phyton 不接受负模结果,因此将 100 加到 -25。
打印(-325 - (-325 % 100))
我真的不太了解它,但是由于您正在学习C++,我想从我的个人经验中告诉您一些事情,如果您正在用C++制作程序并且正在使用模运算符,并且您总是想要 +ve mod,您应该做这样的事情 -
a = b%m;
if(a<0) a += m;
我不太确定何时以及为什么,但是 a 可以为任何b 和 m 取负值(不仅当 b 为 -ve 时)
- 为什么模数运算符不适用于该代码
- 我可以通过取每个数字的模并取和来计算大数的模数吗?
- 运算符重载 % 为复数的模数
- 使用模数时如何解决C++输出负数?
- 如果偶数浮点数(分数数)的模数为 2,那么它不会给出'0'结果!在C++
- 在 c++ 中模拟抛硬币时,模数如何工作?
- 如何使用while循环找到GCD?模数运算符是如何工作的
- 在 C++ 中向 rand() 添加模数会影响 for 循环之外的执行,为什么以及如何补救?
- C++ : 如何计算提高到大幂的数字的模数?
- 蟒蛇和C++模数
- 从 0 到 10^18 的数字之和,模数为 10^9+7
- 我正在使用模数处理密码,字母"u"无法正确解码
- 在环路中使用模数会导致分段错误(磁芯转储)
- 通过递归计算模数而不使用模除法
- 循环和模数
- 设置公共指数 e 的默认值,并获取 n 作为键对的模数
- 平方的大数的模数
- 计算大数的模数
- C++中带负数的模数
- 使用Openssl和C++从公钥中提取模数和指数