/**
* 基本思想:分治递归,将大数相乘分解为大数相加问题
* eg:(123)*(12)
* =(1*10^2+2*10^1+3*10^0)*(1*10^1+2*10^0)
*/
private static void getMul(String a, String b) {
char[] as = a.toCharArray();
char[] bs = b.toCharArray();
int al = as.length;
int bl = bs.length;
String[] result = new String[al*bl];
int res = 0;//初始化相乘结果
int w = 0;//初始化位移数
String mul ="";//初始化真正乘积的字符串
int index = 0;//
//获取两个个位数相乘结果以及位移数(两个个位数相乘结果最大值为81,最小值为0)
for(int i=1;i<=al;i++){//3
for(int j=1;j<=bl;j++){//2
res = Integer.parseInt(as[i-1]+"")*Integer.parseInt(bs[j-1]+"");//得到相乘结果
w = al-i+bl-j;//得到总的位移数
mul =res+"";
for(int k=0;k<Integer.parseInt(w+"");k++){
mul+="0";
}
result[index] = mul;//相加数存入数组,真正有用的只有这个
index++;
}
}
//递归累加数组
String mulResult = "0";
for(int l=0;l<al*bl;l++){
String js = mulResult;
String bjs = result[l];
char[] jcs = js.toCharArray();
char[] bjcs = bjs.toCharArray();
mulResult = jcs.length>bjcs.length?getSum(js,bjs):getSum(bjs,js);
}
try {
System.out.println("期望结果:" + Integer.parseInt(a) * Integer.parseInt(b));
} catch (Exception e) {
System.out.println("算不出来啊亲");
}finally{
System.out.println("实际结果:"+mulResult);
}
}
/**
* 基本思想:分治递归,相同位进行相加
*/
private static String getSum(String a, String b) {//默认a的长度大于b的长度
//将字符串转换为字符数组
char[] ac = a.toCharArray();
char[] bc = b.toCharArray();
int al = ac.length;
int bl = bc.length;
//将字符数组倒序排列
List<String> alist = new ArrayList<>();
for(int i=0;i<al;i++){
alist.add(ac[ac.length-i-1]+"");
}
List<String> blist = new ArrayList<>();
for(int i=0;i<bl;i++){
blist.add(bc[bc.length-i-1]+"");
}
//初始化进位值,非1即0
int sfjw = 0;
List<String> resList = new ArrayList<String>();
//先把较短的加完,短数组不在参与运算
for(int i=0;i< bc.length;i++){
int res = Integer.parseInt(alist.get(i))+Integer.parseInt(blist.get(i))+sfjw;
//计算下次的进位值
if(res>=10){sfjw = 1;}
else {sfjw=0;}
//相加结果取余即为当前位的值
resList.add(res%10+"");
}
//短数组运算完毕,仅计算长数组与进位值即可
for(int j=bc.length;j<ac.length;j++){
int res = Integer.parseInt(alist.get(j))+sfjw;
if(res>=10){sfjw = 1;}
else {sfjw=0;}
resList.add(res%10+"");
if(j==ac.length-1&&sfjw == 1){
resList.add(1+"");
}
}
//将数组倒序输出,即为相加结果
String resStr="";
for(int i=resList.size()-1;i>=0;i--){
resStr+=resList.get(i);
}
return resStr;
}