Math 添加两个分数,为什么(次要)优化有效

Math 添加两个分数,为什么(次要)优化有效,math,Math,前几天,我在我的代码库中添加了一个分数类(第一次,以前从未需要过,我怀疑我现在是否需要,但他妈的:-))。当写两个分数之间的加法时,我发现了一个小的优化,但它没有意义(在数学意义上)为什么它是这样 为了说明这一点,我将使用分数A和B,有效地分别由分子和分母的An、Bn、Ad和Bd组成 下面是我用于GCD/LCM的两个函数,公式也在维基百科上。它们很简单,可以理解。当然,LCM也可以是(A*B)/C static unsigned int GreatestCommonDivisor(unsigne

前几天,我在我的代码库中添加了一个分数类(第一次,以前从未需要过,我怀疑我现在是否需要,但他妈的:-))。当写两个分数之间的加法时,我发现了一个小的优化,但它没有意义(在数学意义上)为什么它是这样

为了说明这一点,我将使用分数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功能中发生的情况完全相同。其他的似乎也有道理,除了正确的因子乘以原始分子被交换,具体来说,在这一行:

new_numerator = An * den_quot_b + Bn * den_quot_a  
为什么不是AA+BB

输入示例: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; 

这很简单,你通常会做的就是让分数在同一个分母上——用每个分数的分子和分母乘以另一个分数在分母中的因子,而这个因子在第一个分母中不存在

2是从18中缺失的36因子;3是12中缺少的36的系数。因此,你可以乘:

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

这很简单,你通常会做的就是让分数在同一个分母上——用每个分数的分子和分母乘以另一个分数在分母中的因子,而这个因子在第一个分母中不存在

2是从18中缺失的36因子;3是12中缺少的36的系数。因此,你可以乘:

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

也许你错过了数论的一个恒等式。。。对于任意两个正数
m
n

 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)。

也许你缺少数论的一个恒等式。。。对于任意两个正数
m
n

 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)。

我很难在这里看到一个问题。问题就在这一行:新的分子=An*den*b+Bn*den\u quot a——为什么它不是aa+bb?叫我老式吧,但对我来说,一个问题后面是一个问号。下次我一定会用这种方式说得很具体。我很难在这里看到一个问题。问题就在这一行内:新的分子=An*den'u quot'u b+Bn*den'u quot-a——为什么它不是aa+bb?叫我老式,但对我来说,问题是后面有问号的东西。问号补充道。下次我一定会用这种方式说得很具体。