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