我在前一天添加了一個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;
我很難在這裏看到一個問題。 – 2009-08-04 17:04:35
不是一個真正的問題 – dfa 2009-08-04 17:17:34