C# 普通分数的加减

C# 普通分数的加减,c#,fractions,C#,Fractions,我试图把两个粗俗的分数相加,找到最小的公分母,然后相加。然而,我的代码并不像预期的那样运行,并且输出了两个非常高的负数。当我将第二个分数更改为3/15时,它输出0/0 以下是我的主要程序代码: class Program { static void Main(string[] args) { Fraction n = new Fraction(2, 4); Fraction z = new Fraction(3, 12); Fra

我试图把两个粗俗的分数相加,找到最小的公分母,然后相加。然而,我的代码并不像预期的那样运行,并且输出了两个非常高的负数。当我将第二个分数更改为3/15时,它输出0/0

以下是我的主要程序代码:

class Program
{
    static void Main(string[] args)
    {
        Fraction n = new Fraction(2, 4);
        Fraction z = new Fraction(3, 12);

        Fraction sum = n.Add(z, n);
        int num = sum.Numerator;
        int den = sum.Denominator;

        Console.WriteLine("{0}/{1}", num, den);
        Console.ReadKey(true);
    }
}
这是我的
分数
课程代码:

internal class Fraction
{
    public Fraction(int numerator, int denominator)
    {
        Numerator = numerator;
        Denominator = denominator;
    }

    public int Numerator { get; private set; }

    public int Denominator { get; private set; }

    public Fraction Add(Fraction fraction2, Fraction fraction8)
    {
        int lcd = GetLCD(fraction8, fraction2);

        int x = lcd/fraction8.Denominator;
        int n = lcd/fraction2.Denominator;
        int f2num = fraction2.Numerator*n;
        int f8num = fraction8.Numerator*x;

        int t = fraction2.Numerator;

        Fraction Fraction3 = new Fraction(f2num+f8num,lcd);

        return Fraction3;
    }



    public int GetLCD(Fraction b, Fraction c)
    {
        int i = b.Denominator;
        int j = c.Denominator;

        while (true)
        {

            if (i == j)
            {
                return i;
            }
            j = j + j;
            i = i + i;
        }
    }
}

在类中使用
GetLCD,Add&Subtract方法是没有意义的。所以,我把它移出了类,让它们成为静态方法

您的
GetLCD
函数无法正确获取LCD。这将为您提供所需的结果。(我没有费心让减法工作,您可以按照下面的代码&让它自己工作)

PS:我没有更改所有变量名&我建议您尽可能使它们有意义。n、 z、x、y、b、c不是好的变量名

    static void Main(string[] args)
    {
        Fraction n = new Fraction(2, 4);
        Fraction z = new Fraction(3, 12);

        Fraction sum = Add(z, n);
        int x = sum.Numerator;
        int y = sum.Denominator;

        Console.WriteLine("{0}/{1}", x, y);
        Console.ReadKey(true);
    }

    public static Fraction Add(Fraction fraction2, Fraction fraction8)
    {

        int lcd = GetLCD(fraction8, fraction2);
        int multiplier = 0;
        if (fraction2.Denominator < lcd)
        {
            multiplier = lcd / fraction2.Denominator;
            fraction2.Numerator = multiplier * (fraction2.Numerator);
            fraction2.Denominator = multiplier * (fraction2.Denominator);
        }
        else
        {
            multiplier = lcd / fraction8.Denominator;
            fraction8.Numerator = multiplier * (fraction8.Numerator);
            fraction8.Denominator = multiplier * (fraction8.Denominator);
        }

        Fraction Fraction3 = new Fraction(fraction2.Numerator + fraction8.Numerator, lcd);

        return Fraction3;
    }

    public static int GetLCD(Fraction b, Fraction c)
    {
        int i = b.Denominator;
        int j = c.Denominator;

        int greater = 0;
        int lesser = 0;

        if (i > j)
        {
            greater = i; lesser = j;
        }
        else if (i < j)
        {
            greater = j; lesser = i;
        }
        else
        {
            return i;
        }
        for (int iterator = 1; iterator <= lesser; iterator++)
        {
            if ((greater * iterator) % lesser == 0)
            {
                return iterator * greater;
            }
        }
        return 0;
    }

    internal class Fraction
    {
        public Fraction(int numerator, int denominator)
        {
            Numerator = numerator;
            Denominator = denominator;
        }
        public int Numerator { get; set; }
        public int Denominator { get; set; }
    }
static void Main(字符串[]args)
{
分数n=新分数(2,4);
分数z=新分数(3,12);
分数和=加(z,n);
int x=分子总和;
int y=和分母;
Console.WriteLine(“{0}/{1}”,x,y);
Console.ReadKey(true);
}
公共静态分数添加(分数分数2、分数8)
{
int-lcd=GetLCD(分数8,分数2);
整数乘数=0;
if(分数2.分母j)
{
较大=i;较小=j;
}
else if(i对于(int iterator=1;iterator来说,在类中使用
GetLCD,Add&Subtract
方法是没有意义的。因此,我将其从类中移出,使其成为静态方法

您的
GetLCD
函数无法正确获取LCD。这将为您提供所需的结果。(我没有费心让减法工作,您可以按照下面的代码操作,让它自己工作)

PS:我没有更改所有变量名&我建议您尽可能使它们有意义。n、z、x、y、b、c不是好的变量名

    static void Main(string[] args)
    {
        Fraction n = new Fraction(2, 4);
        Fraction z = new Fraction(3, 12);

        Fraction sum = Add(z, n);
        int x = sum.Numerator;
        int y = sum.Denominator;

        Console.WriteLine("{0}/{1}", x, y);
        Console.ReadKey(true);
    }

    public static Fraction Add(Fraction fraction2, Fraction fraction8)
    {

        int lcd = GetLCD(fraction8, fraction2);
        int multiplier = 0;
        if (fraction2.Denominator < lcd)
        {
            multiplier = lcd / fraction2.Denominator;
            fraction2.Numerator = multiplier * (fraction2.Numerator);
            fraction2.Denominator = multiplier * (fraction2.Denominator);
        }
        else
        {
            multiplier = lcd / fraction8.Denominator;
            fraction8.Numerator = multiplier * (fraction8.Numerator);
            fraction8.Denominator = multiplier * (fraction8.Denominator);
        }

        Fraction Fraction3 = new Fraction(fraction2.Numerator + fraction8.Numerator, lcd);

        return Fraction3;
    }

    public static int GetLCD(Fraction b, Fraction c)
    {
        int i = b.Denominator;
        int j = c.Denominator;

        int greater = 0;
        int lesser = 0;

        if (i > j)
        {
            greater = i; lesser = j;
        }
        else if (i < j)
        {
            greater = j; lesser = i;
        }
        else
        {
            return i;
        }
        for (int iterator = 1; iterator <= lesser; iterator++)
        {
            if ((greater * iterator) % lesser == 0)
            {
                return iterator * greater;
            }
        }
        return 0;
    }

    internal class Fraction
    {
        public Fraction(int numerator, int denominator)
        {
            Numerator = numerator;
            Denominator = denominator;
        }
        public int Numerator { get; set; }
        public int Denominator { get; set; }
    }
static void Main(字符串[]args)
{
分数n=新分数(2,4);
分数z=新分数(3,12);
分数和=加(z,n);
int x=分子总和;
int y=和分母;
Console.WriteLine(“{0}/{1}”,x,y);
Console.ReadKey(true);
}
公共静态分数添加(分数分数2、分数8)
{
int-lcd=GetLCD(分数8,分数2);
整数乘数=0;
if(分数2.分母j)
{
较大=i;较小=j;
}
else if(i对于(int iterator=1;iterator就个人而言,我认为你的第一个错误是试图计算最小的公分母,而不是仅仅找到最简单的公分母。由于模式识别,找到LCD是人类在纸上解决这一问题的一个伟大策略:我们可以快速识别LCD;但是计算LCD,然后当将分数转换为它时,对于一台每次都必须执行每一步(并且不能识别模式)的计算机来说,显然需要更多的步骤。另外,在将两个分数转换到其LCD后,添加这两个分数后,它甚至不能保证是一个简化的结果。我假设简化的结果是必需的,这通常是分数算术所期望的。由于它似乎很有用,我将简化直接放入构造函数代码中:

internal class Fraction
{
public Fraction(int numerator, int denominator, bool reduce = false)
{
    if (!reduce)
    {
        Numerator = numerator;
        Denominator = denominator;
    }
    else
    {
        var GCD = GreatestCommonDivisor(numerator, denominator);
        Numerator = numerator / GCD;
        Denominator = denominator / GCD;
    }
}

public int Numerator { get; private set; }

public int Denominator { get; private set; }    

public static Fraction Add(Fraction first, Fraction second)
{
    return Combine(first, second, false);
}

public static Fraction Subtract(Fraction first, Fraction second)
{
    return Combine(first, second, true);
}

private static Fraction Combine(Fraction first, Fraction second, bool isSubtract)
{
    var newDenominator = first.Denominator * second.Denominator;
    var newFirst = first.Numerator * second.Denominator;
    var newSecond = first.Denominator * second.Denominator;

    if (isSubtract)
    {
        newSecond = newSecond * -1;
    }

    return new Fraction(newFirst + newSecond, newDenominator, true);
}

private static int GreatestCommonDivisor(int a, int b) 
{
    return b == 0 ? a : GreatestCommonDivisor(b, a % b);
}

}

编辑:从

中盗取了最大公约数代码就个人而言,我认为你的第一个错误是试图计算最小的公约数,而不是仅仅找到最简单的公约数。找到LCD是人类在纸上解决这个问题的一个伟大策略,因为模式识别:我们可以快速识别LCD;但是c计算LCD,然后将分数转换成LCD,对于一台每次都必须执行每一步(并且不能识别模式)的计算机来说,这显然是更多的步骤。另外,在将两个分数转换到LCD后,添加两个分数后,甚至不能保证得到简化的结果。我假设需要简化的结果,就像分数算术通常所期望的那样