大数相加的简单实现

论坛上看见有人问大数相加减乘除如何实现 正好之前似乎有看过这个算法 其实就是返璞归真 个十百千万从低位开始相加(此位不等于二进制位) 超过10的就进位 有了相加的算法 基本上相减 相乘的也就可以做出来了 相除的可能会难一点 不过总体上还是照着我们在小学里面学的思路来

 

public class BigInter
    {
        private string _strInt;
        private int[] _intArr = null;
        private int _length;
        public BigInter(string strInt)
        {
            this._strInt = strInt;
            var tempCharArray = this._strInt.ToCharArray();
            this._length = tempCharArray.Count();
            this._intArr = new int[tempCharArray.Length];
            for (int i = 0; i < tempCharArray.Length; i++)
            {
                var currentStrNum = tempCharArray[i].ToString();
                int intNum = 0;
                if (int.TryParse(currentStrNum, out intNum))
                {
                    _intArr[i] = intNum;
                }
                else
                {
                    throw new ArgumentException(string.Format("输入数字在第{0}位不合法", i + 1));
                }
            }//将输入的字符串数字转化成int类型的数组
        }

        public static string Add(BigInter left, BigInter right)
        {
            var minLength = Math.Min(left._length, right._length);
            var maxLength = Math.Max(left._length, right._length);
            var theBiggerInter = left._length > right._length ? left._intArr : right._intArr;
            var theSmallerInter = theBiggerInter==left._intArr ? right._intArr : left._intArr;
            var tempSmaller = new int[maxLength];
            for (int i = 0; i < maxLength; i++)
            {
                tempSmaller[i] = 0;
            }
            for (int i =0; i <minLength; i++)
            {
                tempSmaller[maxLength-i-1] = theSmallerInter[minLength-i-1];
            }//以上两个循环将较小且数量级比较大数小的数的高位设为0
            var resultIntArray = new int[maxLength + 1];
            for (int i = maxLength; i > 0; i--)
            {
                var currentResult = theBiggerInter[i - 1] + tempSmaller[i - 1] + resultIntArray[i] ;
                if (currentResult >= 10)
                {
                    ++resultIntArray[i-1];
                    resultIntArray[i] = currentResult - 10;
                }
                else
                {
                    resultIntArray[i] = currentResult;
                }//此处就是算法主要的地方 相同位相加 超过10则向上位进位 如果要做相减可以把这块用一个委托来表示 节省复制黏贴
                //对于相乘则必须换思路 resultIntArray的元素数量应该是较大数元素数量的两倍 比如100*100=10000
            }
            
            StringBuilder result = new StringBuilder();//将最终结果输出
            foreach (var temp in resultIntArray)
            {
                result.Append(temp.ToString());
            }
            return result.ToString();
        }
    }


调用的话也比较简单

class Program
    {
        static void Main(string[] args)
        {
            var left = new BigInter("9000000000000000000000000000000000");
            var right = new BigInter("9000000000000000000000000000000000");
            Console.Write(BigInter.Add(left, right));
            Console.ReadLine();
        }
    }

估算一下算法时间复杂度 都是单重循环 所以可以肯定时间复杂度在O(N)  再看看空间利用 设想两个1000位的数字相加 需要3个包含1000个int元素的数组 也就是4byte*1000*3=12000byte 差不多是十几K的样子 如果追求极限的话可以把int数组换为byte或者char 计算的时候再转换为int 这样空间就用了1byte*1000*3差不多3K 还算是可以接受

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值