用C#计算比率

我认为这很简单,但搜索谷歌似乎并没有帮助。

我基本上试图编写一个函数,当有两个整数(例如800和600)时,它会将比率作为字符串(例如4:3)返回。

string GetRatio(Int A, Int B) { // Code I'm looking for return Ratio; } 

您可以通过将分子和分母除以GCD来简化分数:

 var gcd = GCD(A, B); return string.Format("{0}:{1}", A / gcd, B / gcd) 

并且使用欧几里得算法计算GCD的一个非常基本的function:

 static int GCD(int a, int b) { return b == 0 ? Math.abs(a) : GCD(b, a % b); } 

你是否基本上试图获得最大的共同点 – 两个数字的GCD然后将它们除以那么得到你的字符串?

即:800:600; 最大的共同点= 200因此4:3。

这将能够处理所有整数。 很抱歉没有发送代码,但我认为从这里开始应该很简单。

 public int GCD(int a, int b) { while (a != 0 && b != 0) { if (a > b) a %= b; else b %= a; } if (a == 0) return b; else return a; } // Using Konrad's code: var gcd = GCD(A, B); return string.Format("{0}:{1}", A / gcd, B / gcd) 

在过去玩过这样的事情之后,我只想补充一点,处理签名值可能会变得很难看。 让我建议处理有符号值的最简单方法是将Konrad方法应用于原始数字的绝对值 ,如果原始值具有不同的符号,则在结果字符串前加上“ – ”。

使用这种方法,-100和-35的最大公约数为5,比例为20:7。 如果原始输入是对(-100和35)或(100和-35)中的任何一个,你仍然得到5的GCD,初始结果是20:7,但最终的答案是 – 20:7(即标准化forms,无论哪个输入为负,正如-6/2和6 / -2 = -3)。

其他评论员给出了整数的好解; 但是,如果你真的需要处理浮点值,你还需要别的东西。 一般来说,两个实数不具有可以巧妙打印的清洁比率; 你想要的是最接近的理性近似。 可能找到这个的最好方法就是计算商的连续分数扩展; Mark Dominus 对他博客上的人进行了很好的介绍。