5

如何在 C# 中化简分数?例如,给定1 11/6,我需要将其简化为2 5/6

4

4 回答 4

7

如果您只想将分数变成一个带分数,其小数部分是一个真分数,就像前面假设的答案一样,您只需要添加numerator / denominator到数字的整个部分并将分子设置为numerator % denominator. 为此使用循环是完全没有必要的。

然而,术语“简化”通常是指将分数简化为最低项。您的示例并未明确说明您是否也想要这样做,因为无论哪种方式,该示例都是最低限度的。

这是一个标准化混合数的 C# 类,这样每个数字都只有一个表示:小数部分始终是正确的,并且始终是最低项,分母始终为正,整个部分的符号始终与分子的符号。

using System;

public class MixedNumber {
    public MixedNumber(int wholePart, int num, int denom)
    {  
        WholePart = wholePart;
        Numerator = num;
        Denominator = denom;
        Normalize();
    }

    public int WholePart { get; private set; }
    public int Numerator { get; private set; }
    public int Denominator { get; private set; }

    private int GCD(int a, int b)
    {  
        while(b != 0)
        {  
            int t = b;
            b = a % b;
            a = t;
        }
        return a;
    }

    private void Reduce(int x) {
        Numerator /= x;
        Denominator /= x;
    }

    private void Normalize() {
        // Add the whole part to the fraction so that we don't have to check its sign later
        Numerator += WholePart * Denominator;

        // Reduce the fraction to be in lowest terms
        Reduce(GCD(Numerator, Denominator));

        // Make it so that the denominator is always positive
        Reduce(Math.Sign(Denominator));

        // Turn num/denom into a proper fraction and add to wholePart appropriately
        WholePart = Numerator / Denominator;
        Numerator %= Denominator;
    }

    override public String ToString() {
        return String.Format("{0} {1}/{2}", WholePart, Numerator, Denominator);
    }
}

示例用法:

csharp> new MixedNumber(1,11,6);     
2 5/6
csharp> new MixedNumber(1,10,6);   
2 2/3
csharp> new MixedNumber(-2,10,6);  
0 -1/3
csharp> new MixedNumber(-1,-10,6); 
-2 -2/3
于 2011-03-13T15:21:32.740 回答
3
int unit = 1;
int numerator = 11;
int denominator = 6;

while(numerator >= denominator)
{
    numerator -= denominator;
    if(unit < 0)
        unit--;
    else
        unit++;
}

然后对变量做任何你喜欢的事情。

请注意,这并不是特别普遍....特别是我怀疑它是否能很好地处理负数(编辑:现在可能会更好)

于 2011-03-13T05:04:02.933 回答
1
int num = 11;
int denom = 6;
int unit = 1;
while (num >= denom)
{
  num -= denom;
  unit++;
}

抱歉,我没有完全理解关于跟踪单位值的那部分。

于 2011-03-13T04:58:20.803 回答
0

为了简化分数6/11,您会看到是否可以让两者都以大于 1 的相同数字排列并相除。

所以

  • 2,4,6,8,10,12
  • 1,3,6,9,12
  • 4,8
  • 5,10
  • 6,12
  • 7
  • 8
  • 9不。

否将是所有人的答案,所以它已经很简单了。没有更多的事情要做。

于 2013-11-08T17:04:09.200 回答