2015-12-26 1 views
-1

С помощью этой ссылки в SO Calculate a Ratio in C# я могу сделать расчет соотношения в C#Сравните 2 значения соотношения в C#

var gcd = GCD(A, B); 
return string.Format("{0}:{1}", A/gcd, B/gcd) 
static int GCD(int a, int b) { 
    return b == 0 ? a : GCD(b, a % b); 
} 

Теперь, как я могу сравнить соотношение 2 значения

if A:B< 1:10 my result =1 

и

if A:B >1:10 my result=0 

Так как я могу добавить это сравнение отношения в C#, как проверить мой рацион ль чем 1:10 ??

+0

Не могли бы вы прояснить для меня 1:10 больше, чем 1:50 или наоборот? –

+0

Может быть, если вы используете GCD для вычисления коэффициента, вы можете относиться к коэффициенту как фракция и сравнивать результаты деления? 1:10 = 0,1 и 1:50 = 0,02, затем 0,1> 0,02 и 1:10> 1:50. –

+0

@AndreyTretyak Я надеюсь, что редактирование в вопросе отвечает сомнению –

ответ

0

Вы можете создать класс для отношения (с положительным знаменателем).
Он также имеет смысл реализовать 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.

Смежные вопросы