2016-04-05 16 views
2

Ich muss herausfinden, welcher von zwei Brüchen größer als der andere ist. Die Bruchstruktur enthält long Werte für Zähler und Nenner.Korrekte Art, lange Werte zu multiplizieren

Der naive Ansatz ist wie folgt:

try 
{ 
    checked 
    { 
    long a = fraction1.Numerator * fraction2.Denominator; 
    long b = fraction2.Numerator * fraction1.Denominator; 
    return a.CompareTo(b); 
    } 
} 
catch 
{ 
    throw new Exception("CompareTo failed"); 
} 

Dies funktioniert für eine Vielzahl von Fällen, in Ordnung, aber durch einen anderen Datentyp für a und b die Menge der Fälle Wahl, wo eine Ausnahme reduziert kann ausgelöst werden .

Welcher Datentyp wäre eine gute Wahl (vorzugsweise ohne zusätzliche Bibliotheken)? decimal? BigInteger?

+6

'decimal' oder' BigInteger' funktionieren würde, aber nur 'decimal' ist im Rahmen ohne zusätzliche Referenzen, natürlich. –

+0

Um im Bereich von 'Dezimal' zu bleiben, ist die größte Zahl, die ich" quadrieren kann "281,474976,710656, die viel kleiner ist als' long.MaxValue' = 9223372,036854,775807 – David

+0

Whoops - ja, sprach viel zu früh . Das tut mir leid. BigInteger oder zu einem anderen Ansatz wechseln, z. gemeinsame Faktoren finden. –

Antwort

0

Ich löste das Problem, indem ich eine Dezimal-Multiplikation versuchte. Und nur wenn das ausfällt, mache ich eine BigInteger Multiplikation. Das Finden gemeinsamer Faktoren ist natürlich vorher getan.

try 
{ 
    decimal a = (decimal)fraction1.Numerator * (decimal)fraction2.Denominator; 
    decimal b = (decimal)fraction2.Numerator * (decimal)fraction1.Denominator; 
    return a.CompareTo(b); 
} 
catch 
{ 
    BigInteger a = new BigInteger(fraction1.Numerator) * new BigInteger(fraction2.Denominator); 
    BigInteger b = new BigInteger(fraction2.Numerator) * new (fraction1.Denominator); 
    return a.CompareTo(b); 
} 

Randbemerkung: BigInteger von System.Numerics Referenzierung ist akzeptabel für mich in diesem Fall, da es mit .Net kommt 4.

+1

Der überprüfte Block ist in diesem Code unsinnig. Überprüfte Arithmetik gilt nur für Ganzzahlen. –

+0

Danke für den wertvollen Hinweis. Ich habe meinen Code in meiner Antwort geändert. – David

Verwandte Themen