声明:此篇文章完全参考博文:http://blog.csdn.net/sunkun2013/article/details/11822927的大数相乘思想,此博主用图文的形式详细介绍了大数相乘的思想,在参考次博文的基础上,自己编写并实现大数相乘,现将java实现的代码给出,以便以后自己的参考学习;
主要代码的实现
/**
* 高精度乘法函数
* 参考:http://blog.csdn.net/sunkun2013/article/details/11822927
* @param str1
* @param str2
*/
public static int[] multiply(char[] ch1,char[] ch2,int len1,int len2) {
//1.构造各位乘数的二维数组
int[][] temp = new int[len1][len2];
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
int c1 = Integer.parseInt(String.valueOf(ch1[i]));
int c2 = Integer.parseInt(String.valueOf(ch2[j]));
temp[i][j] = c1*c2;
}
}
//2.计算算术和,不考虑进位
int[] r = new int[len1+len2-1]; //保存错位相加的数字
for (int k = 0; k < r.length; k++) {
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
if (i+j == k) { //重点:和计算条件
r[k] += temp[i][j];
}
}
}
}
//处理进位问题:保留各位,十位进位相加
for (int k = r.length-1; k >= 0; k--) {
if (r[k] > 9) {
r[k-1] = r[k]/10+r[k-1];
r[k] = r[k]%10;
}
}
return r;
}
符号位的判断和处理
/**
* 存储在字符串中的两个大数运算
* @param str1
* @param str2
*/
public static void bigDateCalculate(String str1,String str2) {
//1.消除数据的正负号
int i = 0,j=0;
StringBuffer result = new StringBuffer(""); //保存计算结果
//单引号是char类型的数据(只能是单个字符),双引号是String类型的数据
if (str1.charAt(0) == '-') {
str1 = str1.substring(1);
i++;
}
if (str2.charAt(0) == '-') {
str2 = str2.substring(1);
j++;
}
//2.加减乘除方法前都会计算这几个参数
int len1 = str1.length();
int len2 = str2.length();
char[] ch1 = str1.toCharArray();
char[] ch2 = str2.toCharArray();
//除正负号外的大数乘法运算
int[] tempResult = multiply(ch1, ch2, len1, len2);
if (i+j == 1) { //i+j==1表示两个数为异号
result.append("-");
for (int k = 0; k < tempResult.length; k++) {
result.append(tempResult[k]);
}
} else {
for (int k = 0; k < tempResult.length; k++) {
result.append(tempResult[k]);
}
}
System.out.println("两个大数相乘的结果为:"+ result);
}
主函数
public static void main(String[] args) {
String str1 = " 234567890098776665555444449999999";
String str2 = "946587436598437594375943875943875";
str1 = str1.trim(); //排除空格
str2 = str2.trim();
bigDateCalculate(str1, str2);
}