Вычислите Соотношение в C#
-
22-08-2019 - |
Вопрос
Я думал, что это будет просто, но поиск в 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).
Другие комментаторы дали хорошие решения для целых чисел;однако, если вам действительно приходится иметь дело со значениями с плавающей запятой, вам понадобится что-то еще.В общем, два действительных числа не будут иметь чистого соотношения, которое можно было бы красиво напечатать;то, что вы хотите, - это самое близкое рациональное приближение.Вероятно, лучший способ найти это заключается просто в том, чтобы вычислить непрерывное дробное разложение частного;Марк Доминус дает хорошее введение в эти в своем блоге.