初学者 - C#分数计算器简化负分数

时间:2015-04-30 22:40:10

标签: c# calculator simplify

我一直在努力让我的小数计算器工作。我试图让简化工作,它正确地简化了正分数,但是如果我把它放在一个负分数上它不会简化它,我不确定我是什么'我做错了,我已多次读过它(Gcd和Reduce函数)。

我是所有这一切的新手,任何帮助表示赞赏。

我的Reduce和GCD功能:

public int gcd()
{
    // assigned x and y to the answer Numerator/Denominator, as well as an  
    // empty integer, this is to make code more simple and easier to read
    int x = answerNumerator;
    int y = answerDenominator;
    int m;

    // check if numerator is greater than the denominator, 
    // make m equal to denominator if so
    if (x > y)
        m = y;
    else
        // if not, make m equal to the numerator
        m = x;

    // assign i to equal to m, make sure if i is greater
    // than or equal to 1, then take away from it
    for (int i = m; i >= 1; i--)
    {
        if (x % i == 0 && y % i == 0)
        {
            //return the value of i
            return i;
        }
    }

    return 1;
}

public void Reduce()
{
    try
    {
        //assign an integer to the gcd value
        int gcdNum = gcd();

        if (gcdNum != 0)
        {
            answerNumerator = answerNumerator / gcdNum;
            answerDenominator = answerDenominator / gcdNum;
        }

        if (answerDenominator < 0)
        {
            answerDenominator = answerDenominator * -1;
            answerNumerator = answerNumerator * -1;
        }
    }
    catch (Exception exp)
    {
        // display the following error message 
        // if the fraction cannot be reduced
        throw new InvalidOperationException(
            "Cannot reduce Fraction: " + exp.Message);
    }
}

1 个答案:

答案 0 :(得分:0)

简答

你需要:

int x = Math.Abs(answerNumerator);
int y = Math.Abs(answerDenominator);

运行代码

这是一个适合你的小提琴:https://dotnetfiddle.net/nBzr0i

输出:

Initial: 2/4
Reduced: 1/2
---
Initial: 2/-4
Reduced: -1/2
---

运行代码:

using System;

public class Program
{
    public static void Main()
    {
        Calc.Reduce(2,4);
        Calc.Reduce(2,-4);
    }
}

public static class Calc
{
    public static int gcd(int answerNumerator, int answerDenominator)
    {
        // assigned x and y to the answer Numerator/Denominator, as well as an  
        // empty integer, this is to make code more simple and easier to read
        int x = Math.Abs(answerNumerator);
        int y = Math.Abs(answerDenominator);
        int m;
        // check if numerator is greater than the denominator, 
        // make m equal to denominator if so
        if (x > y)
            m = y;
        else
            // if not, make m equal to the numerator
            m = x;
        // assign i to equal to m, make sure if i is greater
        // than or equal to 1, then take away from it
        for (int i = m; i >= 1; i--)
        {
            if (x % i == 0 && y % i == 0)
            {
                //return the value of i
                return i;
            }
        }

        return 1;
    }

    public static void Reduce(int answerNumerator, int answerDenominator)
    {
        Console.Write("Initial: ");
        WriteFraction(answerNumerator, answerDenominator);

        try
        {
            //assign an integer to the gcd value
            int gcdNum = gcd(answerNumerator, answerDenominator);
            if (gcdNum != 0)
            {
                answerNumerator = answerNumerator / gcdNum;
                answerDenominator = answerDenominator / gcdNum;
            }

            if (answerDenominator < 0)
            {
                answerDenominator = answerDenominator * -1;
                answerNumerator = answerNumerator * -1;
            }
        }
        catch (Exception exp)
        {
            // display the following error message 
            // if the fraction cannot be reduced
            throw new InvalidOperationException("Cannot reduce Fraction: " + exp.Message);
        }

        Console.Write("Reduced: ");
        WriteFraction(answerNumerator, answerDenominator);
        Console.WriteLine("---");
    }

    public static void WriteFraction(int answerNumerator, int answerDenominator)
    {
        Console.WriteLine(string.Format("{0}/{1}", answerNumerator, answerDenominator));
    }
}