2013-09-25 39 views
0

我試圖通過找到最低公分母,然後添加兩個粗俗部分在一起。但是,我的代碼不像預期的那樣運行,並且輸出兩個非常高的負數。當我將第二部分更改爲3/15時,它輸出0/0。加減粗俗部分

這裏是我的主要程序代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Fraction n = new Fraction(2, 4); 
     Fraction z = new Fraction(3, 12); 

     Fraction sum = n.Add(z, n); 
     int num = sum.Numerator; 
     int den = sum.Denominator; 

     Console.WriteLine("{0}/{1}", num, den); 
     Console.ReadKey(true); 
    } 
} 

這裏是我Fraction類代碼:

internal class Fraction 
{ 
    public Fraction(int numerator, int denominator) 
    { 
     Numerator = numerator; 
     Denominator = denominator; 
    } 

    public int Numerator { get; private set; } 

    public int Denominator { get; private set; } 

    public Fraction Add(Fraction fraction2, Fraction fraction8) 
    { 
     int lcd = GetLCD(fraction8, fraction2); 

     int x = lcd/fraction8.Denominator; 
     int n = lcd/fraction2.Denominator; 
     int f2num = fraction2.Numerator*n; 
     int f8num = fraction8.Numerator*x; 

     int t = fraction2.Numerator; 

     Fraction Fraction3 = new Fraction(f2num+f8num,lcd); 

     return Fraction3; 
    } 



    public int GetLCD(Fraction b, Fraction c) 
    { 
     int i = b.Denominator; 
     int j = c.Denominator; 

     while (true) 
     { 

      if (i == j) 
      { 
       return i; 
      } 
      j = j + j; 
      i = i + i; 
     } 
    } 
} 
+8

有用的變量名稱將是一個良好的開端 – Jonesopolis

+1

好事OP囊括了所有的這裏使用'語句。嚴肅地說,你需要在這裏縮小這個問題的範圍。看起來你並沒有付出任何努力去調試。另外,你的變量名是可怕的。 – tnw

+3

'GetLCD'沒有做你認爲正在做的事情。 –

回答

2

它沒有意義的,在類GetLCD, Add & Subtract方法。所以,我將它從課堂中移出來,並將它們變成靜態方法。

您的GetLCD功能無法正確顯示LCD。這會給你所需的結果(我沒有費心去做減法的工作,你可以按照下面的代碼&讓它自己工作)

PS:我沒有改變你所有的變量名稱&我會建議你儘可能使它們有意義。 N,Z,X,Y,B,C都不好變量名

static void Main(string[] args) 
    { 
     Fraction n = new Fraction(2, 4); 
     Fraction z = new Fraction(3, 12); 

     Fraction sum = Add(z, n); 
     int x = sum.Numerator; 
     int y = sum.Denominator; 

     Console.WriteLine("{0}/{1}", x, y); 
     Console.ReadKey(true); 
    } 

    public static Fraction Add(Fraction fraction2, Fraction fraction8) 
    { 

     int lcd = GetLCD(fraction8, fraction2); 
     int multiplier = 0; 
     if (fraction2.Denominator < lcd) 
     { 
      multiplier = lcd/fraction2.Denominator; 
      fraction2.Numerator = multiplier * (fraction2.Numerator); 
      fraction2.Denominator = multiplier * (fraction2.Denominator); 
     } 
     else 
     { 
      multiplier = lcd/fraction8.Denominator; 
      fraction8.Numerator = multiplier * (fraction8.Numerator); 
      fraction8.Denominator = multiplier * (fraction8.Denominator); 
     } 

     Fraction Fraction3 = new Fraction(fraction2.Numerator + fraction8.Numerator, lcd); 

     return Fraction3; 
    } 

    public static int GetLCD(Fraction b, Fraction c) 
    { 
     int i = b.Denominator; 
     int j = c.Denominator; 

     int greater = 0; 
     int lesser = 0; 

     if (i > j) 
     { 
      greater = i; lesser = j; 
     } 
     else if (i < j) 
     { 
      greater = j; lesser = i; 
     } 
     else 
     { 
      return i; 
     } 
     for (int iterator = 1; iterator <= lesser; iterator++) 
     { 
      if ((greater * iterator) % lesser == 0) 
      { 
       return iterator * greater; 
      } 
     } 
     return 0; 
    } 

    internal class Fraction 
    { 
     public Fraction(int numerator, int denominator) 
     { 
      Numerator = numerator; 
      Denominator = denominator; 
     } 
     public int Numerator { get; set; } 
     public int Denominator { get; set; } 
    } 
1

我個人認爲,你的第一個錯誤是試圖計算最小公分母,而不僅僅是尋找最簡單的共同點。尋找液晶顯示器對人類來說是一個很大的挑戰,因爲它具有模式識別功能:我們可以快速識別液晶顯示器;但是計算LCD,然後將分數轉換成它是每次必須執行每一步(並且不能識別模式)的計算機的更多步驟。另外,一旦你把它們轉換成LCD後再添加這兩個分數,它甚至不保證是一個減少的結果。我假設減少的結果是必需的,正如通常預期的分數算術。而且因爲它似乎是有用的,我直接把減少到構造函數代碼:

internal class Fraction 
{ 
public Fraction(int numerator, int denominator, bool reduce = false) 
{ 
    if (!reduce) 
    { 
     Numerator = numerator; 
     Denominator = denominator; 
    } 
    else 
    { 
     var GCD = GreatestCommonDivisor(numerator, denominator); 
     Numerator = numerator/GCD; 
     Denominator = denominator/GCD; 
    } 
} 

public int Numerator { get; private set; } 

public int Denominator { get; private set; }  

public static Fraction Add(Fraction first, Fraction second) 
{ 
    return Combine(first, second, false); 
} 

public static Fraction Subtract(Fraction first, Fraction second) 
{ 
    return Combine(first, second, true); 
} 

private static Fraction Combine(Fraction first, Fraction second, bool isSubtract) 
{ 
    var newDenominator = first.Denominator * second.Denominator; 
    var newFirst = first.Numerator * second.Denominator; 
    var newSecond = first.Denominator * second.Denominator; 

    if (isSubtract) 
    { 
     newSecond = newSecond * -1; 
    } 

    return new Fraction(newFirst + newSecond, newDenominator, true); 
} 

private static int GreatestCommonDivisor(int a, int b) 
{ 
    return b == 0 ? a : GreatestCommonDivisor(b, a % b); 
} 

} 

編輯:偷最大公約數代碼this answer