2016-04-05 6 views
2

2つの小数のどちらが他の小数より大きいか把握する必要があります。分数構造は、分子と分母の値をlongに保持します。長い値を掛ける正しい方法

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

これはケースの広い範囲で正常に動作するが、例外がスローされた場合の量を低減することができるabための別のデータ・タイプを選択することによって、次のよう

ナイーブなアプローチであります。

いいえ(いいえ、余分なライブラリを参照しないでください)のデータタイプはどれですか? decimalBigInteger

+6

'decimal'または' BigInteger'は動作しますが、唯一の 'decimal'が付属していますので、System.Numericsからの参照のBigIntegerが、この場合には私のために許容可能ですもちろん、余分な参照なしでフレームワークにあります。 –

+0

'decimal 'の範囲内にとどまるためには、私が"正方形 "でできる最大の数字は281,474976,710656で、' long.MaxValue'よりかなり小さいです。= 9223372,036854,775807 – David

+0

ああ、 。申し訳ありません。 BigIntegerに変更するか、別のアプローチに変更します(例:共通の要素を見つける。 –

答えて

0

10進乗算を試して問題を解決しました。それが失敗すれば(パフォーマンス上の理由から)私はBigIntegerの乗算を行います。もちろん、一般的な要素を見つけることは事前に行われます。

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); 
} 

サイドノート:それはネット4.

+1

チェックされたブロックは、このコードでは無意味です。チェックされた算術は整数にのみ適用されます。 –

+0

貴重なヒントをありがとう。私は私の答えで自分のコードを変更しました。 – David

関連する問題