用C#计算比率

时间:2009-02-09 11:57:02

标签: c# string-formatting

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

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

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

5 个答案:

答案 0 :(得分:34)

您可以通过将分子和分母除以GCD

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

使用Euclidean algorithm

计算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