如果你想要的只是将你的分数变成一个带分数,其小数部分是像前面假设的答案一样的真分数,你只需要添加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