2012-03-02 127 views
1

所以我正在学习C++,在我正在阅读的一本书中,有一个用于查找GCF(最大公因数)的例子。功能如下:Simple Modulo Operations

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,所以这是不可能的。

+1

从什么时候开始'5%15 = 1/3'?你是否模糊分裂? – Mysticial 2012-03-02 05:33:56

+0

其5/15的剩余部分将为0,剩余部分为5 – L7ColWinters 2012-03-02 05:34:25

+0

我认为我把分工与模数混淆了。 – Matt 2012-03-02 05:42:49

回答

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 
+0

谢谢,这有很大的帮助。你给的例子非常有帮助。 – Matt 2012-03-02 05:44:21

+0

@Matt它有一些错误。纠正。 – 0605002 2012-03-02 06:07:05

0

在整数除法,5/15 = 0。由于5%15是余数,它需要是5 C和C++任务是,对于任何aba/b*b + a%b = a

0

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

设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.也许这些东西是基本的,但希望这是很好的背景来补充你的书的解释。