2009-08-04 53 views
1

我在前一天添加了一個Fraction類到我的代碼庫(第一次,以前從未需要過,現在我懷疑我做了什麼,但是到底:-)) 。當在兩個分數之間寫入加法時,我發現了一個小的優化,但它沒有意義(在數學意義上)爲什麼它是這樣的。添加兩個分數,爲什麼(次要)優化工作

爲了說明我將分別使用分數A和B,有效地包括An,Bn,Ad和Bd作爲分子和分母。

下面是我用於GCD/LCM的兩個函數,公式也在維基百科上。他們很容易理解。 LCM當然可以是(A * B)/ C。

static unsigned int GreatestCommonDivisor(unsigned int A, unsigned int B) 
{ 
    return (!B) ? A : GreatestCommonDivisor(B, A % B); 
} 

static unsigned int LeastCommonMultiple(unsigned int A, unsigned int B) 
{ 
    const unsigned int gcDivisor = GreatestCommonDivisor(A, B); 
    return (A/gcDivisor) * B; 
} 

首先讓我們去圍繞第1方法:

least_common_mul = least_common_multiple(Ad, Bd) 
new_nominator = An * (least_common_mul/Ad) + Bn * (least_common_mul/Bd) 
new_denominator = least_common_mul 

瞧,作品明顯,完成。

然後通過我的記事本塗鴉一些我遇到了一個又一個的作品:

greatest_common_div = greatest_common_divisor(Ad, Bd) 
den_quot_a = Ad/greatest_common_div 
den_quot_b = Bd/greatest_common_div 
new_numerator = An * den_quot_b + Bn * den_quot_a 
new_denominator = den_quot_a * Bd 

現在,新的分母是相當明顯的,因爲它是完全一樣的LCD功能發生。其他的似乎有道理過,不同的是,正確的因素乘以被交換原numerators,在這條線要具體:

new_numerator = An * den_quot_b + Bn * den_quot_a 

這是爲什麼不是A A + B乙?

輸入例:5/12 & 11/18

greatest_common_div = 6 
den_quot_a = 12/6 = 2; 
den_quot_b = 18/6 = 3; 
new_numerator = 5*3 + 11*2 = 37; 
new_denominator = 36; 
+3

我很難在這裏看到一個問題。 – 2009-08-04 17:04:35

+0

不是一個真正的問題 – dfa 2009-08-04 17:17:34

回答

6

它是非常簡單的,它是你通常會怎麼做才能讓分數是在同分母 - 由乘以因素每個分數的分子和分母另一部分的分母在第一部分中不存在。

2是從18中缺失的36的因子; 3是36這是從12缺少這樣的因素,你乘:

(5/12) * (3/3) ==> 15/36 
(11/18) * (2/2) ==> 22/36 
0

也許你錯過了數論的標識之一......對於任何兩個正數mn

m*n = gcd(m,n) * lcm(m,n) 

例子:

4*18 = 2 * 36 
15*9 = 3 * 45 

找到一個共同點,以分數a/b和c/d包括使用LCM(b,d)或等價地,BD/GCD(b,d)。

相關問題