【发布时间】:2010-08-28 08:01:53
【问题描述】:
模数的实际用途是什么?我知道模除法是什么。我想到的第一个场景是用它来查找奇数和偶数以及时钟算术。但是我还能在哪里使用它呢?
【问题讨论】:
-
应用程序太多。可能这应该是社区维基。
-
您在需要时使用它。 “时钟算术”涵盖了所有用途,不是吗?
模数的实际用途是什么?我知道模除法是什么。我想到的第一个场景是用它来查找奇数和偶数以及时钟算术。但是我还能在哪里使用它呢?
【问题讨论】:
我发现最常见的用途是“环绕”您的数组索引。
例如,如果您只想重复循环遍历一个数组,您可以使用:
int a[10];
for (int i = 0; true; i = (i + 1) % 10)
{
// ... use a[i] ...
}
模确保i 保持在 [0, 10) 范围内。
【讨论】:
if(i>count(array))i=1; 重新启动它就不那么简单了。然而,for 循环会很好地将所需的显示代码放在一个块中。
我通常在紧密的循环中使用它们,当我必须在每个 X 循环而不是每次迭代时都做一些事情时..
例子:
int i;
for (i = 1; i <= 1000000; i++)
{
do_something(i);
if (i % 1000 == 0)
printf("%d processed\n", i);
}
【讨论】:
要将数字打印为字符串,您需要模数才能找到数字的值。
string number_to_string(uint number) {
string result = "";
while (number != 0) {
result = cast(char)((number % 10) + '0') ~ result;
// ^^^^^^^^^^^
number /= 10;
}
return result;
}
【讨论】:
模数运算的一个用途是在制作hash table 时。它用于将散列函数中的值转换为数组的索引。 (如果哈希表大小是 2 的幂,则可以使用位掩码进行取模,但它仍然是取模运算。)
【讨论】:
对于国际银行帐号的控制号,mod97 technique。
在n 迭代之后也大批量做一些事情。这是NHibernate 的示例:
ISession session = sessionFactory.openSession();
ITransaction tx = session.BeginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.Save(customer);
if ( i % 20 == 0 ) { //20, same as the ADO batch size
//Flush a batch of inserts and release memory:
session.Flush();
session.Clear();
}
}
tx.Commit();
session.Close();
【讨论】:
缓冲通信的通常实现使用循环缓冲区,您可以使用模数算法来管理它们。
【讨论】:
对于没有位运算符的语言,模数可用于获取数字的最低 n 位。例如,要获取 x 的最低 8 位:
x % 256
相当于:
x & 255
【讨论】:
x & 255 将正确报告低位,而在大多数编译器(包括所有符合最新标准的编译器)中,x % 256 将产生垃圾。
模算术在数论、群论、环论、结论、抽象代数、密码学、计算机科学、化学以及视觉和音乐艺术中被引用。
根据我的经验,任何足够先进的算法都可能会涉及上述主题中的一个。
【讨论】:
嗯,你可以从很多角度来看待它。如果您将其视为数学运算,那么它只是一个模除法。即使我们不需要像 % 那样做任何事情,我们也可以使用减法来实现,但是每种编程语言都以非常优化的方式实现它。
并且模除不限于求奇偶数或时钟算术。有数百种算法需要这个模块运算,例如密码学算法等。所以它和其他+、-、*、/等一样是一个通用的数学运算。
除了数学的观点,不同的语言都使用这个符号来定义内置的数据结构,比如在 Perl 中%hash 用于表明程序员声明了一个哈希。所以这一切都因编程语言设计而异。
所以仍然有很多其他的观点可以添加到 % 的使用列表中。
【讨论】: