我认为这很简单,但搜索谷歌似乎没有帮助。
我基本上是在尝试编写一个函数,当提供两个整数(例如 800 和 600)时,它将以字符串形式返回比率(例如 4:3)。
string GetRatio(Int A, Int B) {
// Code I'm looking for
return Ratio;
}
我认为这很简单,但搜索谷歌似乎没有帮助。
我基本上是在尝试编写一个函数,当提供两个整数(例如 800 和 600)时,它将以字符串形式返回比率(例如 4:3)。
string GetRatio(Int A, Int B) {
// Code I'm looking for
return Ratio;
}
您是否基本上试图获得两个数字的最大公分母 - 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(即无论哪个输入为负的标准化形式,就像 -6/2 和 6/-2 = -3)。
其他评论员对整数给出了很好的解决方案;但是,如果您真的必须处理浮点值,则需要其他东西。一般来说,两个实数不会有一个可以漂亮打印的干净比率;你想要的是最接近的有理近似值。可能最好的方法就是计算商的连分数展开;Mark Dominus在他的博客上对这些人做了很好的介绍。
使用以下 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