我认为这很简单,但搜索Google似乎并没有帮助。
我基本上试图编写一个函数,当有两个整数(例如800和600)时,它会以字符串(例如4:3)返回一个比率。
string GetRatio(Int A, Int B) {
// Code I'm looking for
return Ratio;
}
答案 0 :(得分:34)
您可以通过将分子和分母除以GCD:
来简化分数var gcd = GCD(A, B);
return string.Format("{0}:{1}", A / gcd, B / gcd)
计算GCD的一个非常基本的功能
static int GCD(int a, int b) {
return b == 0 ? Math.Abs(a) : GCD(b, a % b);
}
答案 1 :(得分:4)
你是否基本上试图获得最大的共同点 - 两个数字的GCD然后将它们除以那么得到你的字符串?
I.e: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)
答案 2 :(得分:3)
过去曾玩过这样的东西,我只想补充一点,处理签名值会变得很难看。让我建议处理有符号值的最简单方法是将Konrad的方法应用于原始数字的绝对值,如果原始值具有不同的符号,则在结果字符串前加上“ - ”。
使用这种方法,-100和-35的最大公约数为5,比例为20:7。如果原始输入是对(-100和35)或(100和-35)中的任何一个,你仍然得到5的GCD,初始结果是20:7,但最终的答案是 - 20:7(即标准化形式,无论哪个输入为负,正如-6/2和6 / -2 = -3)。
答案 3 :(得分:0)
其他评论员已经为整数提供了很好的解决方案;但是,如果你真的需要处理浮点值,你还需要别的东西。一般来说,两个实数不具有可以巧妙打印的清洁比率;你想要的是最接近的理性近似。可能找到 的最好方法就是计算商的连续分数扩展; Mark Dominus对那些on his blog进行了很好的介绍。
答案 4 :(得分:0)
使用以下2个功能,您将能够获得两个数字的比率,而无需使用除法运算。
static int GCD(int p, int q)//find greatest common divisor
{
if (q == 0)
{
return p;
}
int r = p % q;
return GCD(q, r);
}
static string FindRatio(int num1, int num2)
{
string oran = "";
int gcd;
int quotient = 0;
while (num1 >= num2)
{
num1 = num1 - num2;
quotient++;
}
gcd = GCD(num1, num2);
//without using division finding ration of num1 i1
int i1 = 1;
while (gcd*i1 != num1)
{
i1++;
}
//without using division finding ration of num1 i2
int i2 = 1;
while (gcd * i2 != num2)
{
i2++;
}
oran = string.Concat(quotient, " ", i1,"/",i2);
return oran;
}
输出如下:
coff num1 / num2