public static string Multiply(string num1, string num2)
{
int carry;
int[] result;
int[] multiplicand, multiplier;
multiplicand = Reverse(num1);
multiplier = Reverse(num2);//这两条代码实现字符串反转,并变成数组形式
//存储大数相乘后的结果
result = new int[multiplicand.Length + multiplier.Length + 3];
//两层循环,完成大数乘法运算逐位相乘,然后错位相加
for (int indexMplier = 0; indexMplier < multiplier.Length; indexMplier++)
{
for (int indexMplicand = 0; indexMplicand < multiplicand.Length; indexMplicand++)
{
result[indexMplier + indexMplicand] +=
multiplicand[indexMplicand] * multiplier[indexMplier];
}
}
//处理进位
for (int index = 0; index < result.Length; index++)
{
carry = result[index] / 10;
result[index] = result[index] % 10;
if (carry > 0)
{
result[index + 1] += carry;
}
}
//将结果反转,返回
return Reverse(result);
}
}
两个for循环都表示什么意思?还有result赋值那句,长度为啥+3?
兩個FOR循环是逐位相乘 [a,b,c]*[d,e,f] 會等於 [ad,ae,af],[bd,be,bf]....等等的組合,然後再错位相加
下面的那個for就是处理进位,在result[index]的數除10儲在carry中
result赋值那句,长度+3,是為了給result更多的位置去儲存兩個FOR循环逐位相乘出來的數
和人工运算的规则一样啊。
比如我们要计算 ab * cd
首先计算
b * d,如果结果超过10,那么这一位写 (b * d) % 10(比如结果是12,那么写2)
carry是进位,进位是(b * d) / 10(比如12,进位1)
再算a * d + carry,一样的道理,结果超过10,那么需要 % 10,carry=/10
...
为什么要加3?
因为两个数相乘,结果的位数最大比原来的数字位数的和大2
比如99*99=9801,四位数。其实+2我觉得就可以了。
第一个for:两层循环,完成大数乘法运算逐位相乘,然后错位相加
第二个for循坏:处理进位