识别何时使用模数运算符
我知道模数 (%)算子计算除法的余数。 我怎样才能确定我需要使用模数运算符的情况?
我知道我可以使用模运算符来查看一个数是偶数还是奇数,还是素数或复合数,但就是这样。 我不经常用余数来思考。 我敢肯定,模运算符是有用的,我想学习利用它。
我只是有问题确定模运算符是适用的。 在各种编程情况下,我很难看到一个问题,并意识到“嘿!余下的部门将在这里工作!”。
想象一下,你有一个经过时间以秒为单位,你想把它转换成小时,分钟和秒:
h = s / 3600; m = (s / 60) % 60; s = s % 60;
0 % 3 = 0; 1 % 3 = 1; 2 % 3 = 2; 3 % 3 = 0;
你看到它做了什么? 在最后一步,它回到了零。 这可以用于以下情况:
-
检查N是否可以被M整除(例如,奇数或偶数)或N是M的倍数
-
把一个特定的价值上限。 在这种情况下3。
- 获得一个数字的最后M个数字 – > N%(10 ^ M)。
我使用它来标记进度条和类似的标记通过一个大循环的进展。 进程仅在循环中每隔n次报告一次,或者在计数%n == 0时报告。
我已经使用它限制一个数字到一定的倍数:
temp = x - (x % 10); //Restrict x to being a multiple of 10
- 包装值(如时钟)。
- 为对称密钥algorithm提供有限的域。
- 按位操作。
等等。
例。 你有X字节的消息,但在你的协议中,最大的大小是Y和Y <X.试着写一个小的应用程序,将消息拆分成数据包,你将遇到mod 🙂
素数的计算
任何时候你有划分,并且想要expression除十进制以外的余数,mod运算符是适当的。 想到的东西通常是当你想用剩下的东西做一些可读的东西的时候。 列出你可以把多less物品放入桶中,并说“遗留下来”是好的。
而且,如果你曾经处于一个可能会出现舍入错误的情况,那么模块划分是很好的。 例如,如果你经常分3次,那么你不会想要传递33333作为余数。 传递余数和除数(即分数)是合适的。
正如@jweyrich所说,包装价值。 我发现mod非常方便,当我有一个有限的列表,我想循环遍历它 – 像一些UI元素的颜色的固定列表,如图表系列,我希望所有的系列不同,以可能的程度,但是当我已经用完颜色,只是从头开始。 这也可以用于模式,所以第二次红色出现,它是破灭; 第三次,虚线等 – 但mod只是用来获得红色,绿色,蓝色,红色,绿色,蓝色,永远。
模数可以用来将总分钟转换为“小时和分钟”:
小时=分钟/ 60
minutes_left =分钟%60
在小时位,我们需要去掉小数部分,这取决于你使用的语言。
然后,我们可以相应地重新排列输出。
将线性数据结构转换为matrix结构:其中a
是线性数据的索引, b
是每行的项目数量:
row = a/b column = a mod b
注意上面是简化的逻辑: a
必须在-1除以前偏移-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
右边的所有数字第三位可以被100除尽其余的是在这种情况下的2个最右边的数字,该月份是10.提取年份195810 / 100
收益率1958年。
有很多情况下,它是有用的。
如果你需要限制一个数字在一定的范围内,你可以使用mod。 例如,要生成一个0到99之间的随机数,你可以这样说:
num = MyRandFunction() % 100;
如果出于一些疯狂的原因,你需要做整数除法并得到一个十进制数,并且你不能把整数转换成一个支持十进制除法的数字,或者如果你需要返回一个小数而不是十进制数。
我将使用%
作为模数运算符
例如
2/4 = 0
在哪里做这个
2/4 = 0 and 2 % 4 = 2
所以你可以真的疯了,让我们说,你想让用户input一个分子和一个除数,然后显示他们的结果作为一个整数,然后一个小数。
whole Number = numerator/divisor fractionNumerator = numerator % divisor fractionDenominator = divisor
模数除法有用的另一个例子是,如果你正在增加或者减less一个数字,而你想把这个数字包含在一定的数字范围内,但是当你到达最高点或者最低点的时候,你不想停下来。 您要分别循环到列表的最下面或最上面。
想象一下你正在循环一个数组的函数。
Function increase Or Decrease(variable As Integer) As Void n = (n + variable) % (listString.maxIndex + 1) Print listString[n] End Function
n =(n + variable)%(listString.maxIndex + 1)的原因是为了考虑最大索引。
这些只是我不得不在模拟应用程序中使用模数的一部分,而是在机器人和仿真环境中。
- 计算最大公约数
- 确定一个数是否是回文
- 确定一个数字是否只包含…
- 确定有多less…一个数字由…组成
我最近看到的一个用例就是当你需要倒转一个数字的时候。 因此, 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; }
我最喜欢的用途是迭代。
假设你有一个计数器,你正在递增,然后想从一个已知列表中抓取一个对应的项目,但是你只有n
项目可供select,并且你想重复一个循环。
var indexFromB = (counter-1)%n+1;
结果( counter=indexFromB
)给出n=3
:
`1=1` `2=2` `3=3` `4=1` `5=2` `6=3` ...
这是一个简单的方法来判断一个数字是偶数还是奇数。 只要做#mod 2,如果是0就是偶数,1是奇数。