今天见一道算法题,要求实现两个不限长度的正整数的乘法。感觉不难,便顺手做了一下。我这里的实现比较简单,基本上就是模拟算术运算,大概分成如下几步
125
x 11
-------
125
125
--------
1375
- 将乘数每位与乘数相乘,获取到一个m*n的矩阵
- 将矩阵错位相加,得到输出数组
- 对输出中数组进行进位运算
一个简单的实现如下
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结构,可以实现不限长度的大数运算,比我的这个潦草地实现要凶猛得多的。