Java中的大整数BigInteger

本文探讨了Java中如何通过BigInteger类计算超出long范围的大数阶乘,介绍了BigInteger的基本用法、转换方法、创建方式以及常见运算,如加减乘除、比较和整数溢出处理。通过实例演示了如何计算50的阶乘,确保了高精度计算。
摘要由CSDN通过智能技术生成

引出问题

在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
}


更多内容请移步个人博客:乌托邦

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值