1

その数値の一部として先行ゼロを持つことができる可変長の数値を格納しようとしています。

先行ゼロに関する情報を失うことなくこのような値を格納でき、longの上限を超える可能性がある.NET Frameworkのクラスはありますか?

私は現在、これらを次のようなクラスに格納しています。BCLで使用可能な構造体またはクラスがない場合に、このクラスをより適切に記述できる方法はありますか。

[Serializable]
public class Number
{
    public int[] Array { get; set; }
    public int Length { get { return Array.Length; } }

    public Number(string number)
    {
        Array = new int[number.Length];

        for (int i = 0; i < number.Length; i++)
        {
            Array[i] = Convert.ToInt32(number[i].ToString());
        }
    }

    public Number(int[] array)
    {
        Array = array;
    }

    public int ToInt()
    {
        return Convert.ToInt32(ToString());
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder(Array.Length);

        foreach (int i in Array)
            sb.Append(i);

        return sb.ToString();
    }
}

これを構造体として使用する機能は、同等性を簡単にチェックする機能と同様に、非常に便利です。

太字/斜体の項目は、そのようなクラスの要件です。

4

4 に答える 4

2

再設計で対処する必要のあるクラスの問題がいくつかあります。

  • クラスは値を表し、変更可能です。
  • int配列パラメーターを受け取るコンストラクターは、参照のみをコピーします。
  • 値はlongより大きくすることができますが、ToInt()メソッドからintとして返されます。

このクラスのサイズを縮小するために最初に行うことは、整数の配列を、数値の2進表現を構成するビットの定数ストリームとして使用することです。これにより、必要な操作の正確性を確保するためにさらに注意が必要になりますが、スペースを大幅に節約できます。その場合、先行ゼロを追跡するための変数、またはおそらく変数の「合計桁数」のセマンティクスも格納します。

申し訳ありませんが、これはあなたの質問に対する答えではありませんが、うまくいけば、これがあなたのクラスを再設計するのに役立つでしょう。

于 2010-01-29T22:18:53.210 に答える
2

C#の大きな整数に関するこの質問を見てみることをお勧めします。先行ゼロの問題については、それらを拡張できます。

于 2010-01-29T22:10:16.223 に答える
0

BigIntegerが公開されるまで、最初の数値を取得/設定するために、1つのパブリック文字列プロパティを使用して独自のクラス/構造体を作成します(これにより、先行ゼロが維持されます)。次に、文字列を解析してIntXインスタンスを返すReadOnlyプロパティを用意します。

于 2010-01-29T22:19:03.333 に答える
0

.Net 4.0のBigIntegerは、上限要件に対応しています。

先行ゼロの要件を処理するには、このようなクラスがまだ必要だと思います。

于 2010-01-29T22:05:41.837 に答える