1

文字列リテラルに含まれる 2 つの非常に大きな数値を比較する最良の方法は何ですか?

たとえば、フォローを比較したいのは、 "900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

また

"0000000000111111111111111111111111111111111111111111111111111111111111111111" "0000001111111111111111111111111111111111111111111111111111111111111111111111"

どちらの場合も明らかに 2 番目の方が優れていますが、要素を反復処理せずに効率的に見つけるにはどうすればよいでしょうか?

4

3 に答える 3

8

個人的には、最も単純なアプローチを採用します: を使用BigIntegerして両方の値を解析し、それらの結果を比較します。それは非常に効率的ではありませんが、非常に単純です。そして、ベンチマークを実行して、十分に高速かどうかを確認できます。

それ以外の場合は、先頭のゼロを無視して有効な長さを見つけることができます。一方の数値が他方の数値よりも長い場合は、それだけで十分です。または、より短い可能性のある文字列の「有効な」桁を取得するメソッドを作成し、必要に応じて 0 を返し、1 つの文字列がより大きな値になるまで、長い文字列の長さから下に向かって比較します。何かのようなもの:

// Return the digit as a char to avoid bothering to convert digits to their
// numeric values.
private char GetEffectiveDigit(string text, int digitNumber)
{
    int index = text.Length - digitNumber;
    return index < 0 ? '0' : text[index];
}

private int CompareNumbers(string x, string y)
{
    for (int i = int.Max(x.Length, y.Length); i >= 0; i--)
    {
        char xc = GetEffectiveDigit(x, i);
        char yc = GetEffectiveDigit(y, i);
        int comparison = xc.CompareTo(yc);
        if (comparison != 0)
        {
            return comparison;
        }
    }
    return 0;
}

これは、それが有効な数値であることをまったくチェックせず、負の数値を処理しようとしないことに注意してください。

于 2013-05-17T14:56:51.300 に答える
2

比較すると、ブールチェックを意味する場合、これは機能します:

public class Program
{
    static void Main(string[] args)
    {
        string a = "0000000090000000000000000000000000000000000000000000000000000000000000000000000000001";

        string b = "000100000000000000000000000000000000000000000000000000000000000000000000000000009";

        Console.WriteLine(FirstIsBigger(a, b));

        Console.ReadLine();
    }

    static bool FirstIsBigger(string first, string second)
    {
        first = first.TrimStart('0');
        second = second.TrimStart('0');
        if (first.Length > second.Length)
        {
            return true;
        }
        else if (second.Length == first.Length)
        {
            for (int i = 0; i < first.Length; i++)
            {
                double x = char.GetNumericValue(first[i]);
                double y = char.GetNumericValue(second[i]);
                if (x > y) return true;
                else if (x == y) continue;
                else return false;
            }
        }

        return false;
    }
}
于 2013-05-17T15:12:33.930 に答える