开发BigInt类

时间:2012-10-11 00:28:02

标签: c# stack bigint

我已经开始开发一个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);
    }

无论这个问题是什么,这种类设计的模式是否有效?设计这类课程有更好的想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

请注意,添加并不是最棘手的操作:等到你遇到乘法和除法!要了解您需要解决的复杂性,请下载Java's implementation of BigInteger

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