Вычислить коэффициент в С#

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

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

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

Ответы

Ответ 1

У меня нет готового кода, но он должен быть довольно простым. А именно, определите 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 ? a : GCD(b, a % b);
}

Ответ 2

Вы в основном пытаетесь получить наибольший общий знаменатель - 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 code: 

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

Ответ 3

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

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

Ответ 4

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