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,我一直在努力寻找解决方法。