模数(%)在编程中的实际用途是什么?

时间:2010-08-28 08:01:53

标签: operators modulo

  

可能重复:
  Recognizing when to use the mod operator

模数的实际用途是什么?我知道模数除法是什么。我想到的第一个场景是使用它来查找奇数和偶数,以及时钟算术。但是我可以在哪里使用它?

9 个答案:

答案 0 :(得分:22)

我发现最常见的用途是“包裹”你的数组索引。

例如,如果您只想重复遍历数组,可以使用:

int a[10];
for (int i = 0; true; i = (i + 1) % 10)
{
  // ... use a[i] ...
}

模数确保i保持在[0,10]范围内。

答案 1 :(得分:6)

我通常在紧密循环中使用它们,当我必须在每个X循环中执行某些操作而不是每次迭代时都会这样做。

示例:

int i;
for (i = 1; i <= 1000000; i++)
{
   do_something(i);
   if (i % 1000 == 0)
       printf("%d processed\n", i);
}

答案 2 :(得分:5)

要将数字打印为字符串,您需要使用模数来查找数字的值。

string number_to_string(uint number) {
  string result = "";
  while (number != 0) {
    result = cast(char)((number % 10) + '0') ~ result;
    //                   ^^^^^^^^^^^
    number /= 10;
  }
  return result;
}

答案 3 :(得分:5)

模数运算的一个用途是制作hash table时。它用于将哈希函数的值转换为数组的索引。 (如果哈希表大小是2的幂,模数可以用位掩码完成,但它仍然模数运算。)

答案 4 :(得分:4)

对于国际银行帐号的控制号,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();

答案 5 :(得分:3)

  • 加密。仅这一点就可以解释模数的百分比(我夸大了,但你明白了。)

尝试the Wikipedia page

  

模数运算在数论,群论,环理论,结理论,抽象代数,密码学,计算机科学,化学以及视觉和音乐艺术中被引用。

根据我的经验,任何足够先进的算法可能会触及上述主题之一。

答案 6 :(得分:3)

缓冲通信的常规实现使用循环缓冲区,您可以使用模运算来管理它们。

答案 7 :(得分:2)

嗯,你可以看到许多观点。如果你把它看作一个数学运算,那么它只是一个模数除法。即使我们不需要像%那样做,我们也可以使用减法来实现,但是每种编程语言都以非常优化的方式实现它。

modulu division不仅限于寻找奇数和偶数或时钟算术。有数百种算法需要这种模块操作,例如加密算法等。所以这是一般的数学运算,如其他+, - ,*,/等。

除了数学视角,不同的语言使用此符号来定义内置数据结构,就像在Perl %hash中用来表示程序员声明了一个哈希。所以这一切都因编程语言设计而异。

所以仍有许多其他观点可以添加到%的使用列表中。

答案 8 :(得分:2)

对于没有按位运算符的语言,可以使用模数来获得数字的最低n位。例如,要获得x的最低8位:

x % 256

相当于:

x & 255