3

この手順を実行する方法を知る必要があります。

calculation1: 1/4 = 0,25
calculation2: 1/8 = 0,125
calculation3: 47/183 = 0,25683060109289617486338797814207......
calculation4: 58/889 = 0,06524184476940382452193475815523......
calculation5: 1/5 = 0,2

計算1、2、および5の結果は、短い結果、ピリオドなし、または無限の数字列を示します。計算3と4の結果は非常に長く、複雑です。

どの計算が「簡単」で「短い」結果になるかを確認するにはどうすればよいですか。

私はこれを試しましたが、確かに間違った結果が得られました...ご覧のとおり、計算の結果にはdouble私のアプリケーションのデータ型が含まれています。

static bool IsInt(double x)
    {
        try
        {
            int y = Int32.Parse(x.ToString());
            return true;
        }
        catch
        {
             return false;
        }
    }

私が何を求めているのかが明確になっていることを願っています。

4

2 に答える 2

16

分数を可能な限り減らした後、分母を2の累乗に5の累乗を掛けたものとして表すことができる場合、小数表現は終了します。それ以外の場合は、無期限に繰り返されます。

次のように、部門が「良好」であるかどうかをテストできます。

public bool IsGoodDivision(int a, int b)
{
    while (b % 2 == 0) { b /= 2; }
    while (b % 5 == 0) { b /= 5; }
    return a % b == 0;
}

オンラインで動作することを確認してください:ideone

分子と分母を別々にメソッドに渡すことに注意してください。最初に除算を行い、次に結果をメソッドに渡すと、浮動小数点表現エラーのために精度が失われます。

また、実動コードの場合b != 0、0で除算することは許可されていないため、チェックする必要があります。チェックしないと、上記のコードは無限ループに入ります。

于 2012-08-23T18:23:56.560 に答える
1

それはあなたの「良い結果」または「簡単な結果」の定義に依存すると思います。しかし、あなたが欲しいのはモジュラス演算子だと思います。

于 2012-08-23T18:23:51.710 に答える