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

Beginner - C# Fractional Calculator simplification of negative fractions

我一直在尝试让我的小数计算器工作时遇到问题。我正在尝试让简化工作,它可以正确地简化正分数,但是如果我要输入负分数,它不会简化它,我不确定我做错了什么,我已经读过在它上面无数次(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);
    }
}

我认为问题在于,当您确定 GCD 时,您正在检查 for 循环中的值是否为 >= 1,即使它可能是负数。为了避免这种情况,在确定GCD时应捕获分子和分母的绝对值。

例如,这应该可以修复它:

public int gcd()
{
    // assigned x and y to the absolute values of 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;
}

简答

你需要:

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

运行代码

这里有一个 运行 Fiddle 给你: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));
    }
}