Вы можете создать класс для отношения (с положительным знаменателем).
Он также имеет смысл реализовать IComparable
интерфейс и операторы сравнения: использование
public class Ratio : IComparable<Ratio>
{
public readonly int A;
public readonly int B;
public Ratio(int a, int b)
{
if (b < 0)
{
a = -a;
b = -b;
}
A = a;
B = b;
}
public int CompareTo(Ratio other)
{
return A * other.B - B * other.A;
}
public static bool operator <(Ratio r1, Ratio r2)
{
return r1.CompareTo(r2) < 0;
}
public static bool operator >(Ratio r1, Ratio r2)
{
return r1.CompareTo(r2) > 0;
}
public static bool operator >=(Ratio r1, Ratio r2)
{
return r1.CompareTo(r2) >= 0;
}
public static bool operator <=(Ratio r1, Ratio r2)
{
return r1.CompareTo(r2) <= 0;
}
public static bool operator ==(Ratio r1, Ratio r2)
{
return r1.CompareTo(r2) == 0;
}
public static bool operator !=(Ratio r1, Ratio r2)
{
return r1.CompareTo(r2) != 0;
}
}
Пример:
var r1 = new Ratio(1, 10); // 1/10
var r2 = new Ratio(2, 20); // 2/20
Console.WriteLine(r1 >= r2); // true
Console.WriteLine(r1 > r2); // false
Console.WriteLine(r1 < r2); // false
Console.WriteLine(r1 == r2); // true
var r1 = new Ratio(1, 10); // 1/10
var r2 = new Ratio(1, 11); // 1/11
Console.WriteLine(r1 >= r2); // true
var r1 = new Ratio(1, 10); // 1/10
var r2 = new Ratio(1, 9); // 1/9
Console.WriteLine(r1 >= r2); // false
Или вы можете просто использовать логику метода CompareTo
выше.
Для 2 соотношений a/b
и c/d
где b,d > 0
:
a/b > c/d
верно тогда и только тогда, когда a*d > c*b
.
Не могли бы вы прояснить для меня 1:10 больше, чем 1:50 или наоборот? –
Может быть, если вы используете GCD для вычисления коэффициента, вы можете относиться к коэффициенту как фракция и сравнивать результаты деления? 1:10 = 0,1 и 1:50 = 0,02, затем 0,1> 0,02 и 1:10> 1:50. –
@AndreyTretyak Я надеюсь, что редактирование в вопросе отвечает сомнению –