长整数相乘思路分析完整版
长整数相乘思路分析完整版
想要解决一件复杂的事情,一般思路都是先从简单的开始,比如工业革命,就是从自行车到汽车再到轮船、火车。由简单到复杂,又开始瞎扯了,小朋友看到后,再去看看真正的工业革命。
1.不考虑进位的相乘,举例12*12
(1)首先将字符串倒序放入数组
列算式我们会发现,总是从个位开始乘以被乘数的个位到十位,因此,按照我们的计算习惯,就分别把12和12这两个字符串逆序放入数组中。
String array1="12";String array2="12";
for(int i=0;i<arrs1.length();i++){ array1[i]=arrs1.charAt(arrs1.length()-i-1)-'0'; } for(int i=0;i<arrs2.length();i++){ array2[i]=arrs2.charAt(arrs2.length()-i-1)-'0'; }在上面的代码值得注意的是,一定要减一个0字符串,或者减整数48,才能转换为真正的整数。
(2)将每一列依次相乘相加
在不考虑进位的情况下,我们需要依次相乘,在正常情况下,我们会看到,星星表示相加的时候需要补0。
//将中间的结果值放入subArrays中,即图中的420(第一次循环相乘的值)以及021和420的和 for(int i=0;i<arrs1.length();i++){ StringBuffer minArrays=new StringBuffer();//每一位相乘的结果 int subBenWei=0;
//(1)给每一位的计算结果加入0,便于加法计算,这个时候可以看到第一次的时候不进入此循环,
第一次的时候进入此循环,是为21前面加入0才好和420按位相加。所以中间这个代码的位置必须
考虑清楚放入计算之前
for(int h=0;h<i;h++){
minArrays.append(0);
}
//按位依次相乘
for(int j=0;j<arrs2.length();j++){
subBenWei=array1[i]*array2[j];
minArrays.append(subBenWei); } if(i==0){ //第一次的运算,结果不需要进行判断是否补0 subArrays=minArrays; }else{ //先判断中间位数和每次位数相同,然后不同的补0,这次补0不同于上边介绍的补0,而是为
//420补0,因为每一次的乘法的结果要比上依次的多一位,所以要为上一位补0
if(minArrays.length()>subArrays.length()){ for(int f=0;f<minArrays.length()-subArrays.length()+1;f++){ subArrays.append(0); } } //将每一次的结果累加,放入subArrays中,准备下次用 int benWei; for(int j=0;j<minArrays.length();j++){ benWei=(minArrays.charAt(j)-'0')+(subArrays.charAt(j)-'0'); subArrays.setCharAt(j,(char)(benWei+'0')); } } }
(3)按照我们正常思路算得的subArrays需要逆序输出
return subArrays.reverse().toString();
2.考虑进位相乘的情景
(1)按位相乘其实想明白很简单,无非是有进位,则在第二次相乘的结果上加入进位的数
如下图所示:
接下来我们看一下代码实现,标红的代码就是进位计算的代码
//将中间还没加的值,放入subarrays中 for(int i=0;i<arrs1.length();i++){ StringBuffer minArrays=new StringBuffer();//每一位相乘的结果 int subJinWei=0; int subBenWei=0; //给每一位的计算结果加入0,便于加法计算 for(int h=0;h<i;h++){ minArrays.append(0); } for(int j=0;j<arrs2.length();j++){ subBenWei=(array1[i]*array2[j]+subJinWei)%10;//计算本位,值加进位,然后取余 subJinWei=(array1[i]*array2[j]+subJinWei)/10;//计算进位,值加进位,然后取商 minArrays.append(subBenWei); //判断是否是最后一位数字相乘,并且是否有进位,有进位需要把最后进的一位添加进去 if(j==array2.length-1&&subJinWei>0){ minArrays.append(subJinWei); } } if(i==0){ //第一次的运算,结果不需要进行判断是否进位 subArrays=minArrays; }else{ //先判断中间位数和每次位数相同,然后不同的补0 if(minArrays.length()>subArrays.length()){ for(int f=0;f<minArrays.length()-subArrays.length()+1;f++){ subArrays.append(0); } } //将每一次的结果累加,放入subArrays中,准备下次用 int jinWei=0; int benWei; for(int j=0;j<minArrays.length();j++){ benWei=((minArrays.charAt(j)-'0')+(subArrays.charAt(j)-'0')+jinWei)%10; jinWei=((minArrays.charAt(j)-'0')+(subArrays.charAt(j)-'0')+jinWei)/10; subArrays.setCharAt(j,(char)(benWei+'0')); } if(jinWei>0){ subArrays.append(0); } } }
想必,大家看过这个分析,就觉得长整数相乘其实也很简单,思路就是由简单到复杂
3.完整代码
package com.jisuan; import java.math.BigInteger; import java.util.Arrays; public class Multiplication2 { private static String mutiStr(String arrs1,String arrs2){ int[] array1=new int[arrs1.length()]; int[]array2=new int[arrs2.length()]; StringBuffer subArrays=new StringBuffer(); //倒序放入数组中,然后方便后期乘法 for(int i=0;i<arrs1.length();i++){ array1[i]=arrs1.charAt(arrs1.length()-i-1)-48; } for(int i=0;i<arrs2.length();i++){ array2[i]=arrs2.charAt(arrs2.length()-i-1)-48; } //将中间还没加的值,放入subarrays中 for(int i=0;i<arrs1.length();i++){ StringBuffer minArrays=new StringBuffer();//每一位相乘的结果 int subJinWei=0; int subBenWei=0; //给每一位的计算结果加入0,便于加法计算 for(int h=0;h<i;h++){ minArrays.append(0); } for(int j=0;j<arrs2.length();j++){ subBenWei=(array1[i]*array2[j]+subJinWei)%10; subJinWei=(array1[i]*array2[j]+subJinWei)/10; minArrays.append(subBenWei); //判断是否是最后一位数字相乘,并且是否有进位,有进位需要把最后进的一位添加进去 if(j==array2.length-1&&subJinWei>0){ minArrays.append(subJinWei); } } if(i==0){ //第一次的运算,结果不需要进行判断是否进位 subArrays=minArrays; }else{ //先判断中间位数和每次位数相同,然后不同的补0 if(minArrays.length()>subArrays.length()){ for(int f=0;f<minArrays.length()-subArrays.length()+1;f++){ subArrays.append(0); } } //将每一次的结果累加,放入subArrays中,准备下次用 int jinWei=0; int benWei; for(int j=0;j<minArrays.length();j++){ benWei=((minArrays.charAt(j)-'0')+(subArrays.charAt(j)-'0')+jinWei)%10; jinWei=((minArrays.charAt(j)-'0')+(subArrays.charAt(j)-'0')+jinWei)/10; subArrays.setCharAt(j,(char)(benWei+'0')); } if(jinWei>0){ subArrays.append(0); } } } return subArrays.reverse().toString(); } public static void main(String args[]){ String result=mutiStr("999999","10000000"); System.out.println(result); } }