1

私はBigIntクラスの開発を始めましたが、今は行き詰まっています。問題は、長さが異なる2つの数値を加算しようとすると、結果が正しくないことです。たとえば、123 + 1は223を返します。問題がどこにあるかはわかっていますが、修正についてサポートが必要です。

        public static BigInt operator +(BigInt n1, BigInt n2)
    {
        Stack<char> sNew = new Stack<char>();
        Stack<char> sTemp = new Stack<char>();
        int currentDigit1, currentDigit2, sum;
        int carry = 0;

        //insert the digits, XXXyyy + ZZZ = first insert ___yyy and then calculate XXX+ZZZ
        if (n1.GetLength() > n2.GetLength())
        {
            while (n1.GetLength() > n2.GetLength())
                sNew.Push(n1.sDigits.Pop());
        }
        else if (n2.GetLength() > n1.GetLength())
        {
            while (n2.GetLength() > n1.GetLength())
                sNew.Push(n2.sDigits.Pop());
        }

        while (n1.sDigits.Count > 0)
        {
            currentDigit1 = int.Parse(n1.sDigits.Pop().ToString());
            currentDigit2 = int.Parse(n2.sDigits.Pop().ToString());
            sum = currentDigit1 + currentDigit2 + carry;
            carry = 0;

            if (sum > 10)
            {
                carry = 1;
                sum = sum % 10;
            }

            sNew.Push(char.Parse(sum.ToString()));

        }

        //if there is a carry, for example 95+18
        if (carry > 0)
            sNew.Push(char.Parse(carry.ToString()));

        //flip the stack
        while (sNew.Count > 0)
            sTemp.Push(sNew.Pop());
        while (sTemp.Count > 0)
            sNew.Push(sTemp.Pop());

        return new BigInt(sNew);
    }

この問題に関係なく、クラス設計のこのパターンは効果的ですか?この種のクラスを設計するためのより良いアイデアはありますか?

4

1 に答える 1

1

これはかなり無駄な表現であり、10 進数 1 桁に完全な 8 ビットを使用します。およそ 60% のスペースが無駄になります!

この表現にとどまる場合でも、内部表現を a から a に切り替えることを検討する必要があります。Stack<char>最下位List<char>桁は位置0に格納され、十の位の桁は位置 に格納さ1れます。これにより、両方の数字が使用可能な場合は同じ位置に数字を追加するか、長い数字の数字にキャリーを追加する単一のループで加算を実装できます。

より適切な表現は、base-256 システムを使用し、個々の「数字」をバイト配列として格納することです。

足し算は実装するのが最も難しい操作ではないことに注意してください: 掛け算と割り算を実行するまで待ってください! 対処しなければならない複雑さを調べるには、Java の の実装をBigIntegerダウンロードしてください。

これは、実際のプロジェクトの一部としてではなく、楽しみのために行っていると想定しています。そうでなければ、.NET の組み込み表現である を使用しない言い訳はありませんBigInteger

于 2012-10-11T00:39:46.157 に答える