简单的模运算

时间:2012-03-02 05:30:46

标签: c++ int division modulo

所以我正在学习C ++,在我正在阅读的一本书中,有一个例子可以找到GCF(最常见的因素)。功能如下:

int gcf(int a, int b) {
    if(b == 0) {
        return a;
    }
    else {
        return gcf(b, a%b);
    }
}

我不明白的是,如果我以15和5为例,那么

a = 15
b = 5
b is not 0 so then the else statement executes
(5, 15%5 = 0) so since b is now 0 it returns, a, which is 5.

这是有道理的,但如果我扭转数字,为什么/如何得到相同的答案?

a = 5
b = 15
b is not 0 so then the else statement executes
(15, 5%15) but 5%15 is .3 or 1/3, but in C++, 5%15 returns 5.

我不明白5来自哪里,如果有的话,因为它是一个整数,我认为它可能会返回0但它不会返回15,所以它不可能。

4 个答案:

答案 0 :(得分:3)

您正在做的是整数计算 - 不涉及浮点或分数。

5 % 15实际上是将5除以15得到的余数,当然是5(商数为0)。

15 |  5 | 0   <-- this is the first call gcf(5, 15)
      0
     ---
      5 | 15 | 3  <-- this is the first recursive call gcf(15, 5)
          15
         ---
           0 |  5 |   <-- this is the second recursive call gcf(5, 0), returns 5

答案 1 :(得分:1)

模运算符不同于除法,通常当我们除以返回值是商时,但当你使用模运算符返回值是它的提醒。 在你的情况下

**

  

a = 5且b = 15,a%b的返回值为0,

**

这就是它返回的原因5.检查以下链接以更清楚地了解模运算符 http://www.cplusplus.com/doc/tutorial/operators/

http://www.cprogramming.com/tutorial/modulus.html

答案 2 :(得分:0)

在整数除法中,5/15 = 0.由于5%15是余数,因此需要为5. C和C ++强制要求任何ab,{{ 1}}。

答案 3 :(得分:0)

如果你感兴趣的话,你在那里写的那段代码叫做Euclid算法,这是基于Euclid的引理(那里有很大的惊喜)。虽然我从一位教授那里听说有些人可能会提到欧几里德引理的不同表述。我的高等代数书特别将其称为“平等gcd”。 它声明:

设a,b,q和c为a = qb + c的整数。然后gcd(a,b)= gcd(b,c)

gcd(a,b)是指a和b的最大公约数。 这似乎正是您在计划中所做的。

对于任何b,任何整数a都可以写为qb + c。这意味着a是产品qb加上一些余数c。这里的余数是您在使用%运算符时计算的内容。如果我们让a = 12且b = 5那么可以写12 = 5q + c。设q为2.然后我们的余数c为2.也许这些是基本的,但希望这是补充你的书的解释的好背景。