Рассчитать соотношение в C # - PullRequest
17 голосов
/ 09 февраля 2009

Я думал, что это будет просто, но поиск в Google, похоже, не помог.

Я в основном пытаюсь написать функцию, которая будет возвращать отношение в виде строки (например, 4: 3), когда снабжается двумя целыми числами (например, 800 и 600).

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

Ответы [ 4 ]

34 голосов
/ 09 февраля 2009

Вы можете упростить дроби, разделив числитель и знаменатель на их 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);
}
4 голосов
/ 09 февраля 2009

Вы в основном пытаетесь получить наибольший общий знаменатель - 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)
3 голосов
/ 09 февраля 2009

Поиграв с такими вещами в прошлом, я просто добавлю, что работа со знаковыми значениями может быть ужасной. Позвольте мне предложить, что самый простой способ обработки значений со знаком - это применить подход Конрада к абсолютным значениям ваших исходных чисел, а затем добавить «-» к результирующей строке, если исходные значения имеют разные знаки.

При таком подходе наибольший общий делитель -100 и -35 равен 5 при соотношении 20: 7. Если бы исходные входные данные были либо из пар (-100 и 35), либо (100 и -35), вы все равно получили бы GCD 5 и начальный результат 20: 7, но окончательный ответ был бы - 20: 7 (т.е. стандартизированная форма независимо от того, какой вход был отрицательным, так же как и -6/2 и 6 / -2 = -3).

0 голосов
/ 09 февраля 2009

Другие комментаторы дали хорошие решения для целых чисел; если вам действительно нужно иметь дело со значениями с плавающей точкой, вам понадобится что-то еще. Как правило, два действительных числа не будут иметь чистого отношения, которое может быть напечатано красиво; то, что вы хотите, является ближайшим рациональным приближением. Вероятно, лучший способ найти , который , - это просто вычислить непрерывное разложение дробей частного; Марк Доминус хорошо знакомит с этими в своем блоге .

...