JAVA中解决大数乘法和加法问题

前言

    在日常的算法练习中难免会遇见涉及阶乘的计算的题目,总所周知阶乘的数据会变得非常大,此时int和long型都装不下只能借助于String来表示,所以这里特为大家提供两种解决方案:1、使用Java API中的BigInteger类,该类中提供加(add())、减(subtract())、乘(multiply())、除(divid())的成员方法,我们可以通过这四种成员方法来进行我们的大整数运算。2、由于我们在计算中常用的是大整数加法和大整数乘法运算,所以我们可以自己构造相应的方法来实现我们的计算目的。

一、借助Java API---BigInteger类

  • 示例程序如下
import java.math.BigInteger;
 
public class Main{
    public static void main(String[] args) {
       BigInteger bi1 = new BigInteger("123456789");//乘数1
       BigInteger bi2 = new BigInteger("123456789");//乘数2

       //public BigInteger add(BigInteger val):加
       System.out.println("add:"+bi1.add(bi2));
           //public BigInteger multiply(BigInteger val):乘
       System.out.println("multiply:"+bi1.multiply(bi2));
   }
}

二、构造大整数乘法和加法运算的方法

  • 大整数加法运算方法
public static String add(String a,String b){
       if(a.length() <= 8 && b.length() <= 8){
           return Integer.parseInt(a) + Integer.parseInt(b) + "";
       }
       String a1 = "0";
       String a2 = a;//低八位
       if(a.length() > 8){
           a1 = a.substring(0,a.length()-8);
           a2 = a.substring(a.length()-8);
       }
        String b1 = "0";
        String b2 = b;//低八位
        if(b.length() > 8){
            b1 = b.substring(0,b.length()-8);
            b2 = b.substring(b.length()-8);
        }
        String t = add(a2,b2);//低八位相加和
        if(t.length() > 8) return add(add(a1,b1),"1") + t.substring(1);
        while(t.length() < 8) t = "0" + t;//低八位相加和不够八位时,在前面补零
        return add(a1,b1) + t;
    }
  • 大整数乘法运算方法
public static String muti(String s1,String s2){
        if(s1.length() <= 4 && s2.length() <= 4){//当两个乘数均小于4位时,直接计算就可以了
            return Integer.parseInt(s1) * Integer.parseInt(s2) + "";
        }
        if(s1.length() > 4){//当s1位数超过4位时,将s1一分为二
            int k = s1.length() / 2;//保存s1被分割位置的下表
            String a1 = s1.substring(0,k);//s1的高位
            String a2 = s1.substring(k);//s1的低位
            return add(muti(a1,s2)+zero(a2.length()),muti(a2,s2));//高位与s2相乘在其后补上s2的长度个零在与低位与s2相乘的结果相加
        }
        return  muti(s2,s1);//当s2的长度超过4时,将s2与s1的位置对调求解
    }
  • 注:补零算法zero(int k)实现代码如下
public static String zero(int k){
       if(k == 0) return "";
       if(k == 1) return "0";

       int m = k / 2;
       int n = k % 2;

       return zero(m) + zero(m) + zero(n);//利用m + m + n = k
    }

示例程序请访问我之前的文章
更多博文欢迎访问我的个人空间

猜你喜欢

转载自www.cnblogs.com/alex-jzw/p/12459613.html