我知道modulus(%)运算符计算除法的余数。如何确定需要使用模数运算符的情况?
我知道我可以使用模数运算符来查看数字是偶数还是奇数和素数或复合数,但这就是它。我不经常考虑剩余的问题。我确定模数运算符很有用,我想学习利用它。
我只是在识别模数运算符适用的位置时遇到问题。在各种编程环境中,我很难看到问题并意识到“嘿!其余的部门会在这里工作!”。
答案 0 :(得分:25)
想象一下,您有一个以秒为单位的经过时间,并且您希望将其转换为小时,分钟和秒:
h = s / 3600;
m = (s / 60) % 60;
s = s % 60;
答案 1 :(得分:19)
0 % 3 = 0;
1 % 3 = 1;
2 % 3 = 2;
3 % 3 = 0;
你看到它做了什么?在最后一步,它回到了零。这可以在以下情况下使用:
检查N是否可以被M整除(例如,奇数或偶数) 要么 N是M的倍数。
设置特定值的上限。在这种情况下3。
答案 2 :(得分:16)
我用它来表示通过大循环标记进度的进度条等。仅在循环中每隔n次报告进度,或者当计数%n == 0时报告进度。
答案 3 :(得分:11)
我在将数字限制为某个倍数时使用过它:
temp = x - (x % 10); //Restrict x to being a multiple of 10
答案 4 :(得分:10)
等等。
答案 5 :(得分:4)
实施例。您有X字节的消息,但在您的协议中,最大大小为Y,Y
答案 6 :(得分:4)
将线性数据结构转换为矩阵结构:
其中a
是线性数据的索引,b
是每行的项数:
row = a/b
column = a mod b
上面的注释是简化逻辑:a
在分割&之前必须偏移-1。结果必须标准化+1。
示例:( 3行4)
1 2 3 4
5 6 7 8
9 10 11 12
(7 - 1)/4 + 1 = 2
7 is in row 2
(7 - 1) mod 4 + 1 = 3
7 is in column 3
模数的另一个常见用法:按地点散列数字。假设您想存储年份和年份以六位数字195810为单位的月份。month = 195810 mod 100
右边第3个数字可以被100整除,所以剩余部分是最右边的2个数字,在这种情况下,月份为10.提取年份195810 / 100
得出1958年。
答案 7 :(得分:3)
素数的计算
答案 8 :(得分:3)
任何时候你有除法并且想要表示十进制以外的余数,mod运算符是合适的。想到的事情通常是当你想用剩下的东西做一些人类可读的东西时。列出你可以放入桶中的多少项,并说“剩下5个”是好的。
此外,如果您遇到可能会出现舍入错误的情况,则模数除法很好。例如,如果您经常将3除以3,那么您不希望以剩余的方式传递.33333。通过余数和除数(即分数)是合适的。
答案 9 :(得分:3)
正如@jweyrich所说,包装价值观。当我有一个有限列表并且我想在循环中迭代它时,我发现mod非常方便 - 就像某些UI元素的固定颜色列表一样,如图表系列,我希望所有系列都不同,尽可能的,但是当我的颜色用尽时,只是从头开始。这也可以用于比较模式,这样第二次红色就会出现,它会破灭;第三次,点缀等 - 但mod只是用来获得红色,绿色,蓝色,红色,绿色,蓝色,永远。
答案 10 :(得分:3)
我最近看到的一个用例就是你需要撤消一个号码。例如,123456
变为654321
。
int number = 123456;
int reversed = 0;
while ( number > 0 ) {
# The modulus here retrieves the last digit in the specified number
# In the first iteration of this loop it's going to be 6, then 5, ...
# We are multiplying reversed by 10 first, to move the number one decimal place to the left.
# For example, if we are at the second iteration of this loop,
# reversed gonna be 6, so 6 * 10 + 12345 % 10 => 60 + 5
reversed = reversed * 10 + number % 10;
number = number / 10;
}
答案 11 :(得分:3)
模数可用于将总分钟转换为“小时和分钟”:
小时=分钟/ 60
minutes_left =分钟%60
在小时位中我们需要删除小数部分,这取决于您使用的语言。
然后我们可以相应地重新排列输出。
答案 12 :(得分:2)
有许多情况下它很有用。
如果您需要将数字限制在一定范围内,则可以使用mod。例如,要生成0到99之间的随机数,您可能会说:
num = MyRandFunction() % 100;
答案 13 :(得分:2)
这是判断一个数字是偶数还是奇数的简单方法。只需做#mod 2,如果它是0则是偶数,1它是奇数。
答案 14 :(得分:2)
答案 15 :(得分:2)
如果由于某些疯狂的原因你需要进行整数除法并得到一个小数,并且你不能将整数转换为支持十进制除法的数字,或者如果你需要返回一个分数,那么模数也非常有用十进制。
我将使用%
作为模数运算符
例如
2/4 = 0
这样做
2/4 = 0 and 2 % 4 = 2
所以你真的很疯狂,让我们说你想让用户输入一个分子和一个除数,然后将结果显示为一个整数,然后是一个小数。
whole Number = numerator/divisor
fractionNumerator = numerator % divisor
fractionDenominator = divisor
模数除法有用的另一种情况是,如果你增加或减少一个数字并且你想要将数字包含在一定的数字范围内,但是当你到达顶部或底部时你不想只是停止。您希望分别循环到列表的底部或顶部。
想象一下你在循环数组的函数。
Function increase Or Decrease(variable As Integer) As Void
n = (n + variable) % (listString.maxIndex + 1)
Print listString[n]
End Function
它是n =(n +变量)%(listString.maxIndex + 1)的原因是允许计算最大索引。
在我的编程中,不仅仅是桌面应用程序,而是在机器人和模拟环境中,这些只是我必须使用模数的一部分。
答案 16 :(得分:1)
我最喜欢的用途是迭代。
假设您有一个正在递增的计数器,并希望从已知列表中获取相应的项目,但您只能选择n
项,并且您想重复一个循环。
var indexFromB = (counter-1)%n+1;
给定counter=indexFromB
的结果(n=3
):
`1=1`
`2=2`
`3=3`
`4=1`
`5=2`
`6=3`
...
答案 17 :(得分:0)
我所见过的模数运算符的最佳用途是检查我们拥有的数组是否是原始数组的旋转版本。
A = [1,2,3,4,5,6] B = [5,6,1,2,3,4]
现在如何检查B是否是A的旋转版本?
第1步:如果A的长度与B的长度不同,那么请确定它不是旋转版本。
第2步:检查B中A的第一个元素的索引。这里A的第一个元素为1,而其在B中的索引为2(假设您的编程语言的索引为零)。 让我们将该索引存储在变量“ Key ”
中第3步:现在如何检查B是否是A的旋转版本?
这是模数函数摇摆的地方:
for (int i = 0; i< A.length; i++)
{
// here modulus function would check the proper order. Key here is 2 which we recieved from Step 2
int j = [Key+i]%A.length;
if (A[i] != B[j])
{
return false;
}
}
return true;
答案 18 :(得分:0)
通常,在循环中,您希望在第k次迭代中执行某项操作,其中k是0 因此,您将执行以下操作: 或者,您想保留某些特定的东西。请记住,当您使用任意数字mod时,它必须产生一个介于0和该数字之间的值-1。int k = 5;
int n = 50;
for(int i = 0;i < n;++i)
{
if(i % k == 0) // true at 0, 5, 10, 15..
{
// do something
}
}