【问题标题】:How to simplify fractions?如何化简分数?
【发布时间】:2011-07-14 08:05:29
【问题描述】:

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

【问题讨论】:

  • 如果输入是“1 10/6”,你想要“2 4/6”还是“2 2/3”?
  • @sepp2k 因为 2 2/3 是最简单的形式,所以我认为他想要这个。

标签: c# math fractions


【解决方案1】:

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

但是,“简化”一词通常是指将分数简化为最低项。您的示例并不清楚您是否也想要这样,因为无论哪种方式,该示例都是最低限度的。

这是一个 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

【讨论】:

    【解决方案2】:
    int unit = 1;
    int numerator = 11;
    int denominator = 6;
    
    while(numerator >= denominator)
    {
        numerator -= denominator;
        if(unit < 0)
            unit--;
        else
            unit++;
    }
    

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

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

    【讨论】:

    • 看来你应该这样做numerator &gt;= denominator。这会让 6/6 == 1
    • 我认为这行得通,但我似乎也认为早上 5 点在 Stack Overflow 上醒着不是一个好主意,所以你的里程可能会有所不同。
    • 哈哈,真的。那更接近了,但想想如果你有-11/6,它永远不会进入你的循环。 -11 不是 &gt;= 6
    【解决方案3】:
    int num = 11;
    int denom = 6;
    int unit = 1;
    while (num >= denom)
    {
      num -= denom;
      unit++;
    }
    

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

    【讨论】:

    • 这似乎是说 11/6 == 5/6。你砍掉了整数部分。
    • 这需要跟踪单位...一个单位变量以及 num 和 denom,在 while 循环中递增,可以解决问题。
    • 循环总是有意的,我只是不明白他们想要跟踪单位价值。
    • 将其分配给 long 是没有意义的,并且会产生不正确的结果。您不妨将其保留为分数形式。呼叫计数器它是什么:单位(或整数部分)。
    • a) 如果任一数字为负数,这将不起作用。 b)为此使用循环太复杂了,您所需要的只是整数除法和模数。 c)我不确定使分数正确是 OP 想要的 - 这不是简化分数通常意味着的。
    【解决方案4】:

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

    所以

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多