18

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

我基本上是在尝试编写一个函数,当提供两个整数(例如 800 和 600)时,它将以字符串形式返回比率(例如 4:3)。

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

5 回答 5

37

您可以通过将分子和分母除以它们的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);
}
于 2009-02-09T12:01:27.110 回答
5

您是否基本上试图获得两个数字的最大公分母 - 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)
于 2009-02-09T12:01:08.437 回答
3

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

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

于 2009-02-09T12:23:03.657 回答
0

其他评论员对整数给出了很好的解决方案;但是,如果您真的必须处理浮点值,则需要其他东西。一般来说,两个实数不会有一个可以漂亮打印的干净比率;你想要的是最接近的有理近似值。可能最好的方法就是计算商的连分数展开;Mark Dominus在他的博客上对这些人做了很好的介绍。

于 2009-02-09T12:10:15.390 回答
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

于 2020-09-26T13:20:24.760 回答