引出问题
在java中范围最大的基本数据类型是long,它可表示的范围是-263 ~ 263 -1。当我们遇到要表示的数超过了该范围时就必须使用BigInteger类。
比如我们要计算n的阶乘。
如果使用int类型我们只能计算到12的阶乘,在往上就会出现错误结果:
public static void test01(int n){
int count=1;
for(int i=1;i<=n;i++){
count*=i;
}
System.out.println(count);
}
//n为12时结果为479001600
如果使用long类型我们只能计算到20的阶乘,在往上就会出现错误结果:
public static void test02(int n){
long count=1L;
for(int i=1;i<=n;i++){
count*=i;
}
System.out.println(count);
}
//2432902008176640000
如果我们想计算更大数的阶乘就必须使用BigInteger类型了,下面就来介绍一下BigInteger类以及使用。
BigInteger类基本介绍
BigInteger
类是在``java.math`包下的一个类,使用时需导入这个包。
BigInteger和Integer、Long一样,也是不可变类,并且都继承了Number,所以BigInteger也有转换为基本类型的方法
BigInteger类的使用
BigInteger类与基本数据类型的转换
BigInteger bigInteger = new BigInteger("1");
bigInteger.byteValue();
bigInteger.shortValue();
bigInteger.intValue();
bigInteger.longValue();
bigInteger.floatValue();
bigInteger.doubleValue();
当BigInteger表示的值超出了基本类型的范围,转换时就会丢失信息,得到的结果是错误的。
要预防这种错误出现,可以使用下面的代码,以int类型为例,其他类型使用对应的方法即可:
bigInteger.intValueExact();
该方法在出现范围溢出是会报错,我们就可以及时发现问题。
BigInteger类的创建
字符串转数字方式
BigInteger bigInteger = new BigInteger("1");
自定义进制
BigInteger bigInteger = new BigInteger("100",2);//2为二进制
System.out.println(bigInteger);//输出4
常用的是字符串转数字的方式。
BigInteger类的运算
加法
BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("2");
BigInteger add = a.add(b);// 加法
System.out.println(add);//102
减法
BigInteger subtract = a.subtract(b); // 减法
System.out.println(subtract);//98
乘法
BigInteger multiply = a.multiply(b); // 乘法
System.out.println(multiply);//200
除法
BigInteger divide = a.divide(b); // 除法
System.out.println(divide);//50
取余
BigInteger mod = a.mod(b); // 取余(只返回正数)
System.out.println(mod);//0
比较大小
使用compareTo()
BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("2");
int i = a.compareTo(b); // 小于返回-1,等于返回0,大于返回1
System.out.println(i);//1
使用min()与max()
BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("2");
BigInteger max = a.max(b); // 返回较大的一个
System.out.println(max); // 100
BigInteger min = a.min(b); // 返回较小的一个
System.out.println(min); // 2
比较是否相等
BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("100");
System.out.println(a.equals(b));//true
计算最大公约数
BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("2");
BigInteger gcd = a.gcd(b); // a和b的最大公约数
System.out.println(gcd); // 2
幂计算
BigInteger b = new BigInteger("2");
BigInteger pow = b.pow(4); // 返回a的4次幂,即a^4
System.out.println(pow); // 16
绝对值
BigInteger a = new BigInteger("-100");
BigInteger abs = a.abs(); // a的绝对值
System.out.println(abs);//100
以上是BigInteger类的常用方法。
解决问题
计算50的阶乘:
public static void test03(int n){//50
BigInteger count=new BigInteger("1");//必须使用大数值类型,不然会溢出
for(int i=1;i<=n;i++){
BigInteger x=BigInteger.valueOf(i);//将int类型转换成BigInteger类型。
count=count.multiply(x);//BigInteger的乘法
}
System.out.println(count);
//30414093201713378043612608166064768844377641568960512000000000000
}
更多内容请移步个人博客:乌托邦