先日、コードベースにFractionクラスを追加していました(最初は必要ありませんでした。 。 2つの分数の間に加算を書くとき、私は小さな最適化を見いだしましたが、なぜそれがそうであるのか(数学的意味で)意味をなさない。2つの端数を加算すると、なぜマイナーな最適化が行われるのですか
説明するために、分母AとBを使用します。分母AとBはそれぞれ分母Aと分母Bと分母Aと分母Bから成り立ちます。
GCD/LCMに使用する2つの関数は次のとおりです。式はWikipediaにもあります。彼らは理解するのに十分単純です。もちろん、LCMももちろん(A * B)/ Cでもかまいません。 、
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
出来上がり行われ、明白な、作品:
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;
}
まず第一のアプローチの周りに行くことができます。 LCD機能に起こるように、それはまったく同じだとして
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
今すぐ新しい分母は、かなり明白です:
はその後、私のメモ帳にいくつかの落書きを通じて私が働く別のものに出くわしました。他のものは、元の分母を乗算する権利要因を特定するこの行に、交換されていることを除いて、あまりにも意味をなすように見える:new_numerator = An * den_quot_b + Bn * den_quot_a
ものではないA + B 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;
ここで質問を見るのは難しいです。 –
実際の質問ではありません – dfa
@Neil:もっと見る。 –