大数乘法

       针对整数相乘的溢出问题

       /// <summary>

        /// 大数乘法
        /// </summary>
        /// <param name="num1">乘数1</param>
        /// <param name="num2">乘数2</param>
        /// <returns></returns>
        public string Multiply(string num1, string num2)
        {
            //拆分
            char[] c1 = getChar(num1);
            char[] c2 = getChar(num2);


            //创建矩阵
            int[,] matrix = getMatrix(c1, c2);


            int[] plus = getTheSameRank(matrix);


            //相加
            string result = getResult(plus);


            return result;
        }


        //拆分数字字符串为字符数组
        private char[] getChar(string num)
        {
            return num.ToCharArray();
        }


        //依据拆分的字符数组创建矩阵
        private int[,] getMatrix(char[] num1, char[] num2)
        {
            int[,] matrix = new int[num1.Length, num2.Length];//创建矩阵


            for (int i = 0; i < num1.Length; i++)
            {
                for (int j = 0; j < num2.Length; j++)
                {
                    matrix[i, j] = Convert.ToInt32(num1[i].ToString()) * Convert.ToInt32(num2[j].ToString());
                }
            }
            return matrix;
        }
        //获取待相加数组
        private int[] getTheSameRank(int[,] matrix)
        {
            //相同的秩,上一行、右一行


            int rows = matrix.GetLength(0);
            int column = matrix.GetLength(1);
            int[] plus = new int[rows + column - 1];
            //最后一行


            //最后一行,从colum-1,1
            for (int i = column - 1; i >= 1; i--)
            {
                int intBase = matrix[rows - 1, i];
                //判断有一侧与上一行是否越界
                int r = i;
                int u = rows - 1;
                while (r + 1 < column && u - 1 >= 0)
                {
                    u = u - 1;
                    r = r + 1;
                    intBase += matrix[u, r];
                }
                plus[rows - 1 + i] = intBase;
            }


            //第一列,从rows-1,0


            for (int i = rows - 1; i >= 0; i--)
            {
                int intBase = matrix[i, 0];
                //判断有一侧与上一行是否越界
                int r = 0;
                int u = i;
                while (r + 1 < column && u - 1 >= 0)
                {
                    u = u - 1;
                    r = r + 1;
                    intBase += matrix[u, r];
                }
                plus[i] = intBase;
            }


            return plus;
        }


        //相加,读取每个数最后一个放入字符串 然后剩余的留作待相加
        private string getResult(int[] ints)
        {
            string result = "";
            int temp = 0;
            for (int i = ints.Length - 1; i >= 0; i--)
            {


                int v = Convert.ToInt32(ints[i]) + temp;
                result = v.ToString().Substring(v.ToString().Length - 1, 1) + result;


                string vs = v.ToString();
                if (vs.Length - 1 > 0)
                {
                    temp = Convert.ToInt32(vs.Substring(0, vs.Length - 1));
                }
                else
                {
                    temp = 0;
                }
            }
            return result;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值