我以为这很简单,但搜索谷歌似乎没什么帮助。
我基本上想编写一个函数,在提供两个整数(例如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)来简化分数:
var gcd = GCD(A, B);
return string.Format("{0}:{1}", A / gcd, B / gcd)
这是使用欧几里得算法计算最大公约数的非常基本的函数:
static int GCD(int a, int b) {
return b == 0 ? Math.Abs(a) : GCD(b, a % b);
}
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在他的博客上对此进行了很好的介绍(链接)。
使用以下两个函数,您将能够在不使用除法运算的情况下获取两个数字的比率。
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