长整数相乘思路分析完整版

长整数相乘思路分析完整版

        想要解决一件复杂的事情,一般思路都是先从简单的开始,比如工业革命,就是从自行车到汽车再到轮船、火车。由简单到复杂,又开始瞎扯了,小朋友看到后,再去看看真正的工业革命。

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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_37525569/article/details/80000567
今日推荐