C# 如何找到两个分数的最小公倍数?

C# 如何找到两个分数的最小公倍数?,c#,C#,前提条件:分数以最简单的形式表示,denom!=0。 不适当的分数是允许的 后置条件:返回两个分数的LCM(作为分数) 对我的分子和分母使用System.Numerics.BigInteger 这是我目前拥有的,但我认为这只适用于biginger…而不是我定制的Fraction类: public static Fraction LCM(Fraction a, Fraction b) { Fraction frac1, frac2;

前提条件:分数以最简单的形式表示,
denom!=0
。 不适当的分数是允许的

后置条件:返回两个分数的LCM(作为分数)

对我的分子和分母使用
System.Numerics.BigInteger

这是我目前拥有的,但我认为这只适用于
biginger
…而不是我定制的
Fraction
类:

public static Fraction LCM(Fraction a, Fraction b)
        {
            Fraction frac1, frac2;
            if (a > b)
            {
                frac1 = a; frac2 = b;
            }
            else
            {
                frac1 = b; frac2= a;
            }

            for (Fraction i = new Fraction(); i < frac2; i = i.Add(new Fraction()))
            {
                if (frac1.Multiply(i).Divide(frac2).Simplify().num == 1)
                {
                    return i.Multiply(frac1);
                }
            }
            return frac1.Multiply(frac2);
        }

你的整数算法是正确的,但它是基于整数运算的,基于除法的思想,有时产生一个自然数,有时产生一个自然数和一个休止符。这在分数中是不可能的。你可以随心所欲地跳水——你总会得到一个新的分数——永远不会有休息

因此,该算法不适用。我找到了一个公式,可以进行转换:

lcm(a/b, c/d) = lcm(a,b,c,d)/lcm(b,d). 

lcm(a,b,c,d)=lcm(lcm(a,b),lcm(c,d)).
所以所有这些都是

lcm(lcm(a,b),lcm(c,d))/lcm(b,d) 
因此,您有4个对整数版本lcm的调用,对分数执行一个lcm

不要修改LCM的int版本

分数版本是

public static BigInteger LCM(Fraction a, Fraction b)
{
      return lcm(lcm(a.num, a.denom), lcm(b.num, b.denom))/lcm(a.denom, b.denom);
}
但这只能找到最小自然数的公倍数。
lcm(1/4,1/8)的结果将是1,而不是人们可能假设的1/4

您的整数算法是正确的,但它是基于整数算法,基于除法的思想,有时产生一个自然数,有时产生一个自然数和一个休止符。这在分数中是不可能的。你可以随心所欲地跳水——你总会得到一个新的分数——永远不会有休息

因此,该算法不适用。我找到了一个公式,可以进行转换:

lcm(a/b, c/d) = lcm(a,b,c,d)/lcm(b,d). 

lcm(a,b,c,d)=lcm(lcm(a,b),lcm(c,d)).
所以所有这些都是

lcm(lcm(a,b),lcm(c,d))/lcm(b,d) 
因此,您有4个对整数版本lcm的调用,对分数执行一个lcm

不要修改LCM的int版本

分数版本是

public static BigInteger LCM(Fraction a, Fraction b)
{
      return lcm(lcm(a.num, a.denom), lcm(b.num, b.denom))/lcm(a.denom, b.denom);
}
但这只能找到最小自然数的公倍数。
lcm(1/4,1/8)的结果将是1,而不是人们可能假设的1/4

你能分享一下分数吗?问题是什么?有什么不起作用吗?你想要“int”而不是“BigInteger”吗?嗨@Holger。我试图使用户可以输入任意大的数字,如
num
denom
。为此,我使用了
biginger
class@Holger. 除了
LCM
功能外,所有功能都正常工作。我的实现只适用于
int
s,而不适用于
Fraction
s,我一直在努力寻找解决方法。你能分享
Fraction
类吗?问题是什么?有什么不起作用吗?你想要“int”而不是“BigInteger”吗?嗨@Holger。我试图使用户可以输入任意大的数字,如
num
denom
。为此,我使用了
biginger
class@Holger. 除了
LCM
功能外,所有功能都正常工作。我的实现只适用于
int
s,而不适用于
Fraction
s,我一直在努力寻找解决方法。