前言
在日常的算法练习中难免会遇见涉及阶乘的计算的题目,总所周知阶乘的数据会变得非常大,此时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
}