2011-03-19 2 views
2

Как вы можете добавить две фракции в C# как это:Как вы можете добавить две фракции?

11/6 + 3/4 = 31/12

, а затем, как бы упростить ответ?

+4

Опубликовать свой текущий прогресс. –

+8

http://en.wikipedia.org/wiki/Least_common_multiple http://en.wikipedia.org/wiki/Greatest_common_divisor –

ответ

2

Найти ЖК-первых, то сделайте следующее

num1 *= lcd/denum1; 
    num2 *= lcd/denum2; 
    sumNum = num1 + num2; 
+1

что такое ldc .. ?? –

+1

Idc, где я использовал его – Dotnet

+1

@hi tech: Я думаю, он имел в виду «Наименее распространенный множественный», и да, lcd - это бедный аббревиатура для этого. –

3

.Net не имеет встроенной поддержки (что я знаю) для Rational Numbers, но есть по крайней мере одна существующая библиотека там.

Ваше решение в конечном счете сводится к хранению числителя и знаменателя (возможно, в созданном вами специальном классе), выполняя арифметику против других пар цифр/знаменателей (возможно, с помощью implementing overloaded operators в вашем классе) и применяя алгоритм упрощения фракций ,

Вот некоторые ресурсы:

Существующие реализации

Способы снижения фракций

0

Я никогда не использовал C#, но я могу дать вам объяснение того, как это сделать.

  1. проверить, если нижнее число одинаковы (равны)
  2. Если не чем создать цикл, который будет перебрать все числа и умножить их донными чисел. Например, позвольте сказать, что вы начали с 1, чем умножить 1 на 6, а затем на 1 на 4, если результат будет таким же, как у вас есть правильный номер.
  3. чем вы номер, который вы получили в # 2 и умножить его на верхние числа
  4. чем просто добавить в начало число
  5. держать нижний номер такой же
  6. создать цикл, чтобы увидеть, что число может быть разделено по обоим номерам (сверху и снизу)
+0

Найти LCM через вложенный цикл? Есть много лучших способов сделать это. –

+0

@Ben: Рекурсия! – Mehrdad

+0

@Mehrdad: Я предполагаю, что это «через все числа», с которыми я действительно сталкиваюсь. Я мог бы сформулировать этот комментарий лучше. –

6

Как удары скуки в пятницу вечером ... в результате получается класс фракций с перегруженными операторами. Трезвость дизайна не может быть гарантирована.

как это работает ...

Fraction left = "1/2"; 
Fraction right = "3/8"; 

Fraction result1 = ((left + right) * left/right).Simplify(); 
Console.WriteLine(result1); 

Fraction test2 = "12/32"; 
test2 = test2.Simplify(); 
Console.WriteLine(test2); 

что-то реализация, как показано ниже ...

public struct Fraction 
{ 
    public int Numerator { get; set; } 
    public int Denominator { get; set; } 

    public Fraction(int numerator, int denominator) 
     : this() 
    { 
     Numerator = numerator; 
     Denominator = denominator; 
    } 

    public Fraction Simplify() 
    { 
     int gcd = GCD(); 
     return new Fraction(Numerator/gcd, Denominator/gcd); 
    } 

    public Fraction InTermsOf(Fraction other) 
    { 
     return Denominator == other.Denominator ? this : 
      new Fraction(Numerator * other.Denominator, Denominator * other.Denominator); 
    } 

    public int GCD() 
    { 
     int a = Numerator; 
     int b = Denominator; 
     while (b != 0) 
     { 
      int t = b; 
      b = a % b; 
      a = t; 
     } 
     return a; 
    } 

    public Fraction Reciprocal() 
    { 
     return new Fraction(Denominator, Numerator); 
    } 


    public static Fraction operator +(Fraction left, Fraction right) 
    { 
     var left2 = left.InTermsOf(right); 
     var right2 = right.InTermsOf(left); 

     return new Fraction(left2.Numerator + right2.Numerator, left2.Denominator); 
    } 

    public static Fraction operator -(Fraction left, Fraction right) 
    { 
     var left2 = left.InTermsOf(right); 
     var right2 = right.InTermsOf(left); 

     return new Fraction(left2.Numerator - right2.Numerator, left2.Denominator); 
    } 

    public static Fraction operator *(Fraction left, Fraction right) 
    { 
     return new Fraction(left.Numerator * right.Numerator, left.Denominator * right.Denominator); 
    } 

    public static Fraction operator /(Fraction left, Fraction right) 
    { 
     return new Fraction(left.Numerator * right.Denominator, left.Denominator * right.Numerator); 
    } 

    public static implicit operator Fraction(string value) 
    { 
     var tokens = value.Split('/'); 
     int num; 
     int den; 
     if (tokens.Length == 1 && int.TryParse(tokens[0], out num)) 
     { 
      return new Fraction(num, 1); 
     } 
     else if (tokens.Length == 2 && int.TryParse(tokens[0], out num) && int.TryParse(tokens[1], out den)) 
     { 
      return new Fraction(num, den); 
     } 
     throw new Exception("Invalid fraction format"); 
    } 

    public override string ToString() 
    { 
     return string.Format("{0}/{1}", Numerator, Denominator); 
    } 
} 
+0

как если фракция + цельный .. ?? –

+0

Я модифицировал неявный оператор для поддержки создания дроби из целого числа. 'Fraction whole =" 5 "' будет работать. Кроме того, вы можете сделать что-то отличное, например, «Fraction test = left +» 5 »;' – Jon

+0

Bravo. Это фантастика. Для этого вы заслуживаете столько стимулов. Это не должно быть обычной проблемой. – Samo

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