在C#中计算比率

20

我以为这很简单,但搜索谷歌似乎没什么帮助。

我基本上想编写一个函数,在提供两个整数(例如800和600)时将比率作为字符串返回(例如4:3)。

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

39

你可以通过将分子和分母除以它们的最大公约数(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);
}

1
<pedantic>语法错误 @ return b == 0 ? a : gcd(b, a % b); 函数gcd未定义</pedantic> - Aamir
请注意,根据您希望从中获得的内容,这可能需要对负输入进行微调。 - fuglede
1
@fuglede 是的,尽管结果在数学上总是正确的。话虽如此,我已经将代码更改为更接近最大公约数常见定义的形式。 - Konrad Rudolph
@Aamir,这是递归,那么如何不能定义GCD呢? - Haseeb Mir

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)

这个网站不是用于预制代码的,GateKiller。从答案中获取知识,编写代码。 - Serafina Brocious
@Cody Brocious:请问您能否指导我哪些规则说明不能要求代码? - GateKiller
没有规定说你不能要求代码。但整个目的是为人们提供一个知识库,让他们能够找到解决问题的答案。仅仅代码片段很少能够完全解释解决方案和问题。 - Filip Ekberg
Filip++。我完全同意。授人以鱼不如授人以渔。 - Serafina Brocious
这就是Gatekiller对“plzsendtehcodez”憎恶的来源吗? :-) - George Stocker

3

过去曾经涉足过这样的事情,我只想说处理有符号值可能会变得很棘手。让我建议一下,处理有符号值最简单的方法是对原始数字的绝对值应用Konrad的方法,然后如果原始值有不同的符号,则在结果字符串前加上“-”。

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


0

其他评论员已经提供了整数的好解决方案;但如果你真的需要处理浮点数值,那么你就需要另外一些东西。通常情况下,两个实数不会有一个干净的比率可以漂亮地打印出来;你想要的是最接近的有理逼近值。可能找到 那个 的最好方法就是计算商的连分数展开式;Mark Dominus在他的博客上对此进行了很好的介绍(链接)


0

使用以下两个函数,您将能够在不使用除法运算的情况下获取两个数字的比率。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接