2012-03-02 56 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.也許這些東西是基本的,但希望這是很好的背景來補充你的書的解釋。