我发现相同的mod操作会产生不同的结果,具体取决于使用的语言.
在Python中:
-1 % 10
Run Code Online (Sandbox Code Playgroud)
产生9
在C中它产生-1!
我知道模数(%)运算符计算除法的余数.如何确定需要使用模数运算符的情况?
我知道我可以使用模数运算符来查看数字是偶数还是奇数和素数或复合数,但这就是它.我不经常考虑剩余的问题.我确定模数运算符很有用,我想学习利用它.
我只是在识别模数运算符适用的位置时遇到问题.在各种编程环境中,我很难看到问题并意识到"嘿!其余的部门会在这里工作!".
为什么X % 0表达无效?
我一直认为X % 0应该等于X.既然你不能除以零,那么答案自然不应该是余数,X(剩下的一切)?
我有一个表software和列,作为dev_cost,sell_cost.如果dev_cost是16000并且sell_cost是7500.
如何找到要销售的软件数量以便恢复dev_cost?
我查询如下:
select dev_cost / sell_cost from software ;
Run Code Online (Sandbox Code Playgroud)
它回答2作为答案.但我们需要得到3,对吧?
对此有什么疑问?提前致谢.
我有一个128位无符号整数A和一个64位无符号整数B.什么是最快的计算方法A % B- 即将A除以B的(64位)余数?
我希望用C或汇编语言来做这件事,但我需要针对32位x86平台.遗憾的是,我无法利用编译器对128位整数的支持,也无法利用x64架构在单条指令中执行所需操作的能力.
编辑:
谢谢你到目前为止的答案.但是,在我看来,建议的算法会非常慢 - 执行128位到64位除法的最快方法是利用处理器对64位乘32位除法的原生支持吗?有没有人知道是否有办法在一些较小的部门中执行更大的划分?
回复:B多久换一次?
主要是我对一般解决方案感兴趣 - 如果A和B每次都可能不同,你会进行什么计算?
然而,第二种可能的情况是B不会像A那样经常变化 - 每个B可能有多达200个As除以.在这种情况下,你的答案有何不同?
数学:
如果你有这样的等式:
x = 3 mod 7
Run Code Online (Sandbox Code Playgroud)
x可以是...... -4,3,10,17 ......,或更一般地:
x = 3 + k * 7
Run Code Online (Sandbox Code Playgroud)
其中k可以是任何整数.我不知道为数学定义了模运算,但因子环肯定是.
Python:
在Python中,当您使用%正数时,您将始终获得非负值m:
#!/usr/bin/python
# -*- coding: utf-8 -*-
m = 7
for i in xrange(-8, 10 + 1):
print(i % 7)
Run Code Online (Sandbox Code Playgroud)
结果是:
6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3
Run Code Online (Sandbox Code Playgroud)
C++:
#include <iostream>
using namespace std;
int main(){
int m = 7;
for(int i=-8; i …Run Code Online (Sandbox Code Playgroud) 在教程中有一个查找素数的示例:
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'equals', x, '*', n//x)
... break
... else:
... # loop fell through without finding a factor
... print(n, 'is a prime number')
...
Run Code Online (Sandbox Code Playgroud)
我知道双重==是对平等的考验,但我不理解这一if n % x部分.就像我可以口头遍历每个部分并说出该声明对该示例的作用.但我不明白百分号是如何落入的.
什么是if n % x真正说什么?
我假设计算数字的模数是一个稍微昂贵的操作,至少与简单的算术测试(例如,查看数字是否超过数组的长度)相比.如果确实如此,替换更有效,例如,以下代码:
res = array[(i + 1) % len];
Run Code Online (Sandbox Code Playgroud)
以下是什么?:
res = array[(i + 1 == len) ? 0 : i + 1];
Run Code Online (Sandbox Code Playgroud)
第一个更容易在眼睛上,但我想知道第二个可能更有效.如果是这样,当使用编译语言时,我是否可以期望优化编译器将第一个代码段替换为第二个代码段?
当然,这种"优化"(如果它确实是一种优化)在所有情况下都不起作用(在这种情况下,它只有在i+1永远不会超过的情况下才有效len).
显然,x86(可能还有很多其他指令集)将除法运算的商和余数都放在不同的寄存器中.
现在,我们可以信任编译器来优化这样的代码,只使用一次调用来划分:
( x / 6 )
( x % 6 )
Run Code Online (Sandbox Code Playgroud)
他们可能会这样做.仍然,任何语言(或图书馆,但主要是寻找语言)支持同时给出除法和模数结果吗?如果是这样,它们是什么,语法是什么样的?