【发布时间】:2011-08-25 18:33:41
【问题描述】:
作为家庭作业,我正在实现 Karatsuba 的算法,并将其与小学风格的 O(n^2) 大整数乘法算法进行基准测试。
我猜我在这里唯一的选择是将数字带入它们的字节数组表示,然后从那里开始处理它们。
好吧,我被困在这里......当使用 * 运算符时,我不知道如果数字溢出字节乘法或添加进位,我将如何检测/纠正。有任何想法吗?
public static BigInteger simpleMultiply(BigInteger x, BigInteger y){
//BigInteger result = x.multiply(y);
byte [] xByteArray = x.toByteArray();
byte [] yByteArray = y.toByteArray();
int resultSize = xByteArray.length*yByteArray.length;
byte [][] rowsAndColumns = new byte[resultSize][resultSize];
for (int i =0; i<xByteArray.length;i++)
for (int j=0; j<yByteArray.length;j++){
rowsAndColumns[i][j] = (byte )(xByteArray[i] * yByteArray[j]);
// how would I detect/handle carry or overflow here?
}
return null;
}
【问题讨论】:
-
两个月前我在这里写了一个big-number tutorial,其中还包括一个乘法。它不使用字节,而是使用
int值(在 0 ... 1000000000 范围内),将其乘以long以避免溢出。 -
@Paulo:谢谢,但我需要 1000 位的整数。
标签: java bytearray biginteger