1

我已经开始开发一个 BigInt 类,我现在被困住了。问题是当我尝试将两个不同长度的数字相加时,结果不正确。例如,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

这是一个相当浪费的表示,一个十进制数字使用完整的八位 - 大约浪费了 60% 的空间!

即使您继续使用这种表示,您也应该考虑将内部表示从 a 切换Stack<char>到 a List<char>,最低有效位存储在 position 0,十位的数字存储在 position 1,依此类推。这将允许您使用单个循环实现加法,如果两个数字都可用,则在同一位置添加数字,或者将进位添加到较长数字的数字。

更好的表示方法是使用 base-256 系统,并将单个“数字”存储为字节数组。

请注意,加法并不是最难实现的操作:等到您遇到乘法和除法!要了解您需要解决的复杂性,请下载Java 的BigInteger.

我假设您这样做是为了好玩,而不是作为真实项目的一部分。否则,没有理由不使用 .NET 的内置表示BigInteger

于 2012-10-11T00:39:46.157 回答