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