5

C#で分数を単純化するには? たとえば、 が与えられた場合1 11/6、 に簡略化する必要があり2 5/6ます。

4

4 に答える 4

7

前の回答のように小数部分が適切な分数である混合数に分数を変換するだけの場合numerator / denominatorは、数の全体に加算して分子をに設定するだけで済みnumerator % denominatorます。これにループを使用する必要はまったくありません。

ただし、「単純化」という用語は通常、分数を最低の用語に減らすことを意味します。あなたの例は、どちらの方法でも最も低い用語であるため、あなたがそれを望むかどうかも明確にしません。

混合数を正規化するC#クラスを次に示します。これにより、各数は常に1つの表現になります。小数部分は常に適切であり、常に最低条件であり、分母は常に正であり、部分全体の符号は常に同じです。分子の記号。

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 に答える