Вопрос

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

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

string GetRatio(Int A, Int B) {
    // Code I'm looking for
    return Ratio;
}
Это было полезно?

Решение

Вы можете упростить дроби, разделив числитель и знаменатель на их НОД:

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);
}

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top