大数相乘

在这之前我们先来了解一下Java 中每种基本数据类型所占存储空间的大小。其中 1Byte = 8bit。

基本类型 大小 最小值 最大值 包装类型
boolean - - - Boolean
char 16-bit Unicode 0 Unicode 2161 Charater
byte 8 bits -128 +127 Byte
short 16 bits 215 +2151 Short
int 32 bits 231 +2311 Integer
long 64 bits 263 +2631 Long
float 32 bits IEEE754 IEEE754 Float
double 64 bits IEEE754 IEEE754 Double


这里实现大数相乘分为两步:

  1. 对较大数进行拆分,分别与较小数相乘,逆序保存在数组中
  2. 对数组中的数值进行保留与进位操作,使数组中的每一个元素都是小于10的数,完成大数运算

大数相乘_第1张图片

代码实现

import java.util.Scanner;

public class BigIntegerTest {
    static long[] array = new long[100];
    static int index = array.length - 1;

    public static void main(String[] args) {

        Scanner read = new Scanner(System.in);
        long num1 = read.nextLong();
        long num2 = read.nextLong();
        boolean flag = false;

        bigNumMultiply(num1,num2);

         System.out.print("结果为:");

        for(int i=0; i<array.length; i++){
            if(array[i] != 0 && flag == false)
                flag = true;
            if(flag)
                System.out.print(array[i]);
        }
    }

    public static void bigNumMultiply(long num1, long num2){
        if(num1 < num2){    //始终保持 num1 > num2 
            long temp = num1;
            num1 = num2;
            num2 = temp;
        }

        while (num1 > 0){
            long num = num1 % 10;   //对num1 进行取余,每次获得个位
            array[index] = num * num2;      //取余后与num2 相乘,倒序保存在数组中
            num1 = num1 / 10;     
            index--;
        }

        index = array.length - 1;

        for(int i=array.length-1; i>0; i--){
            array[i-1] = array[i-1] + array[i] / 10;    //进位
            array[i] = array[i] % 10;    //保留个位
        }
    }
}

测试
99999999999999
99999999999999
结果为:9999999999999800000000000001

PS:Java 所能支持的最大基本整型数值类型是long ,long类型的数值最大是9223372036854775807。所以这种算法有一个局限就是较小数与较大数分解后相乘的数值不能大于long 类型的最大数值。

你可能感兴趣的:(算法与数据结构)