【发布时间】: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# 中化简分数?例如,给定1 11/6,我需要将其简化为2 5/6。
【问题讨论】:
如果您只想将分数变成一个带分数,其小数部分是真分数,就像前面假设的答案一样,您只需将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
【讨论】:
int unit = 1;
int numerator = 11;
int denominator = 6;
while(numerator >= denominator)
{
numerator -= denominator;
if(unit < 0)
unit--;
else
unit++;
}
然后对变量做任何你喜欢的事情。
请注意,这并不是特别普遍......特别是我怀疑它是否能很好地处理负数(编辑:现在可能会更好)
【讨论】:
numerator >= denominator。这会让 6/6 == 1
-11/6,它永远不会进入你的循环。 -11 不是 >= 6
int num = 11;
int denom = 6;
int unit = 1;
while (num >= denom)
{
num -= denom;
unit++;
}
抱歉,我没有完全理解关于跟踪单位值的部分。
【讨论】:
为了简化分数6/11,你会看到你是否可以让两者都以大于 1 的相同数字排列并相除。
所以
2,4,6,8,10,12没有1,3,6,9,12没有4,8没有5,10没有6,12没有7没有8没有9 没有。 No 将是所有人的答案,所以它已经很简单了。没有更多的事情要做。
【讨论】: