在C#中模拟大数乘法

今天见一道算法题,要求实现两个不限长度的正整数的乘法。感觉不难,便顺手做了一下。我这里的实现比较简单,基本上就是模拟算术运算,大概分成如下几步

  125
x  11
-------
  125
 125
--------
 1375

  1. 将乘数每位与乘数相乘,获取到一个m*n的矩阵
  2. 将矩阵错位相加,得到输出数组
  3. 对输出中数组进行进位运算

一个简单的实现如下

    static string Multiplication(string num1, string num2)
    {
        var input1 = num1.Select(i => (int)(i - '0'));
        var input2 = num2.Select(i => (int)(i - '0'));

        //
num1依次和num2每位相乘,获取到一个m*n的矩阵
        var rectangel = input2.Select(i => input1.Select(j => j * i).ToArray()).ToArray();

        //
将矩阵错位相加,得到输出数组
        var result = new int[num1.Length + num2.Length];
        for (int row = 0; row < num2.Length; row++)
        {
            for (int column = 0; column < num1.Length; column++)
            {
                result[column + row + 1] += rectangel[row][column];
            }
        }

        //
对输出中数组进行进位运算
        for (int i = result.Length - 1; i >= 0; i--)
        {
            if (result[i] < 10)
                continue;

            result[i - 1] += result[i] / 10;
            result[i] %= 10;
        }

        return new string(result.Select(i => (char)(i += '0')).ToArray());
    }

当然,这个只是一个算法练习,真正在实际应用中如果用到了大数运算是没必要用这个重复轮子的,在.net 4.0中引入了System.Numerics.BigInteger结构,可以实现不限长度的大数运算,比我的这个潦草地实现要凶猛得多的。

你可能感兴趣的:(C#)