大整数乘法其实很简单(Java)
目的及介绍
- 使用Java语言实现大整数相乘
- 只要弄的大整数相乘,大整数相加、减、除很简单
- 大整数相加,只需要一个循环进行进位操作
- 大整数相减,只需要在循环内进行借位,注意正负号即可
- 大整数相除,就是多次的大整数相减。
设计思路
- 模拟数学上的乘法,按位相乘,最后相加
- 相加的时候,低位超过10的,向前进位
具体步骤
- 首先进行运算符判断,对最后结果是正负有个数
- 人工是可以正向运算的,但是计算机进行字符串逆置,方便计算和存储
- 对于计算的结果,需要找地方存储,新数组的大小即两个数相乘的积位数,不会大于两数位数之和
- 进行运算和数值处理(进位)
- 记得把多余的0去掉,还有带上正负号
代码实现
public class BigIntegersMulti {
public String multi(String args, String args2) {
StringBuffer sb = new StringBuffer(args);
StringBuffer sb2 = new StringBuffer(args2);
int signal = 0;
if ("-".equals(args.substring(0, 1))) {
sb.delete(0, 1);
signal++;
}
if ("-".equals(args2.substring(0, 1))) {
sb2.delete(0, 1);
signal++;
}
char[] ch = sb.reverse().toString().toCharArray();
char[] ch2 = sb2.reverse().toString().toCharArray();
int length = ch.length + ch2.length;
int[] sum = new int[length];
for (int i = 0; i < ch.length; i++) {
for (int j = 0; j < ch2.length; j++) {
sum[i + j] += (ch[i] - '0') * (ch2[j] - '0');
}
}
for (int i = 0; i < length - 1; i++) {
sum[i + 1] += (sum[i] / 10);
sum[i] %= 10;
}
StringBuffer sb3 = new StringBuffer();
int u = length - 1;
while (sum[u] == 0) {
u--;
}
for (; u >= 0; u--) {
sb3.append(sum[u]);
}
if ((signal & 1) == 1) {
sb3.insert(0, "-");
}
return sb3.toString();
}
}
测试案例设计
- 测试负数乘以负数
- 测试正数乘以负数
- 通过9999,99999999的数学关系得到9的倍数关系,进行验证(两个相同的n个9组成的数相乘,结果是由n-1个9加上一个8再加上n-1个0再加上一个1组成)
public void testmulti() {
String s1 = "-12345679", s2 = "-12345679";
String s3 = bigIntegersMulti.multi(s1, s2);
assert s3.equals("152415789971041");
s1 = "12345679";
s2 = "-12345679";
s3 = bigIntegersMulti.multi(s1, s2);
assert s3.equals("-152415789971041");
StringBuffer sb = new StringBuffer();
StringBuffer sb1 = new StringBuffer();
sb.append(9);
for (int i = 1; i < 20; i++) {
sb.append(9);
s3 = bigIntegersMulti.multi(sb.toString(), sb.toString());
for (int j = 0; j < i; j++) {
sb1.append(9);
}
sb1.append(8);
for (int j = 0; j < i; j++) {
sb1.append(0);
}
sb1.append(1);
assert s3.equals(sb1.toString());
sb1 = new StringBuffer();
}
}
排坑细节