我正在使用基本的 Knuth 4.3.1 算法 M 对自然数进行任意精度乘法。我在Java中的实现如下。问题在于它正在生成前导零,这似乎是算法不知道给定结果是有两个位置还是一个位置的副作用。例如,2 x 3 = 6(一位),但 4 x 7 = 28(两位)。该算法似乎总是保留导致前导零的两位数字。
我的问题有两个:(1)我的算法是 M 的正确实现,还是我做错了什么会不必要地创建前导零,以及(2)如果它是 M 的不可避免的副作用,它会产生前导零,那么我们如何调整或使用改进的算法来避免前导零。
// Knuth M algorithm 4.3.1
final public static void multiplyDecimals( int[] decimalM1, int[] decimalN1, int[] result, int radix ){
Arrays.fill( result, 0 );
int lenM = decimalM1[0];
int lenN = decimalN1[0];
result[0] = lenM + lenN;
int iStepM = lenM;
while( iStepM > 0 ){
int iStepN = lenN;
int iCarry = 0;
while( iStepN > 0 ){
int iPartial = decimalM1[iStepM] * decimalN1[iStepN] + result[iStepM + iStepN] + iCarry;
result[iStepM + iStepN] = iPartial % radix;
iCarry = iPartial / radix;
iStepN--;
}
result[iStepM] = iCarry;
iStepM--;
}
return;
}
算法的输出显示正在生成的阶乘,其中显示了前导零。
1 01
2 002
3 0006
4 00024
5 000120
6 0000720
7 00005040
8 000040320
9 0000362880
10 000003628800
11 00000039916800
12 0000000479001600
13 000000006227020800
14 00000000087178291200
15 0000000001307674368000
16 000000000020922789888000
17 00000000000355687428096000
18 0000000000006402373705728000
19 000000000000121645100408832000
20 00000000000002432902008176640000