大小数总结(Finally)

Java 中可以使用 `BigInteger` 和 `BigDecimal` 类来处理大数。下面给出一些常用的方法使用案例:

1. `BigInteger` 类

(1)加法:`add(BigInteger val)`

BigInteger num1 = new BigInteger("123456789");
BigInteger num2 = new BigInteger("987654321");
BigInteger sum = num1.add(num2);
System.out.println(sum); // 输出:1111111110

(2)减法:`subtract(BigInteger val)`

BigInteger num1 = new BigInteger("123456789");
BigInteger num2 = new BigInteger("987654321");
BigInteger diff = num2.subtract(num1);
System.out.println(diff); // 输出:864197532

(3)乘法:`multiply(BigInteger val)`

BigInteger num1 = new BigInteger("123456789");
BigInteger num2 = new BigInteger("987654321");
BigInteger product = num1.multiply(num2);
System.out.println(product); // 输出:121932631137655769

(4)取模:`mod(BigInteger val)`

BigInteger num1 = new BigInteger("123456789");
BigInteger num2 = new BigInteger("98765432");
BigInteger remainder = num1.mod(num2);
System.out.println(remainder); // 输出:46132377

(5)表示二进制数的长度为: 

import java.math.BigInteger;

public class 大数 {
    public static void main(String[] args) {
        BigInteger big =new BigInteger("1000");
        System.out.println(big.toString(2));
        System.out.println( "二进制数的长度为:"+big.bitLength());
    }
}

(6)两种取余的区别

在Java的BigInteger类中,mod和remainder方法都是用来实现大数取余操作的。

mod方法计算的是除法的余数,可以看做是a%b,其中a是被除数,b是除数。如果a和b符号相同,则mod的结果与remainder相同;如果a和b符号不同,则mod返回值的符号与除数b相同,而remainder返回值的符号与被除数a相同。

例如:
 

BigInteger a = new BigInteger("20");
BigInteger b = new BigInteger("3");
System.out.println(a.mod(b)); // 输出为2
System.out.println(a.remainder(b)); // 输出为2

在上面的例子中,20÷3=6 余 2,所以两个方法都返回了值为2的BigInteger对象。

需要注意的是,在Java中取模运算有一个特殊的概念叫做模数(即除数),模数必须为正整数。因此,在使用mod或remainder方法时应该保证除数不等于0。

(7)返回一的个数

     System.out.println(big.bitCount());

2. `BigDecimal` 类

(1)加法:`add(BigDecimal augend)`

BigDecimal dec1 = new BigDecimal("123.456789");
BigDecimal dec2 = new BigDecimal("987.654321");
BigDecimal sum  = dec1.add(dec2);
System.out.println(sum); // 输出:1111.111110

(2)减法:`subtract(BigDecimal subtrahend)`

BigDecimal dec1  = new BigDecimal("123.456789");
BigDecimal dec2  = new BigDecimal("987.654321");
BigDecimal diff  = dec2.subtract(dec1);
System.out.println(diff); // 输出:864.197532

(3)乘法:`multiply(BigDecimal multiplicand)`

BigDecimal dec1    = new BigDecimal("123.456789");
BigDecimal dec2    = new BigDecimal("9876.54321");
BigDecimal product = dec1.multiply(dec2);
System.out.println(product); // 输出:1219326.31137655769

(4)除法:`divide(BigDecimal divisor, int scale, RoundingMode roundingMode)`

BigDecimal dec1  = new BigDecimal("1234.56789");
BigDecimal dec2  = new BigDecimal("1000");
int scale        = 5;
RoundingMode rm  = RoundingMode.HALF_UP;
BigDecimal quot = dec1.divide(dec2, scale, rm);
System.out.println(quot); // 输出:1.23457

(5)快速幂取模方法

BigInteger类中的modPow方法可以用于计算一个大数的幂模运算,也就是计算 `(base^exponent) mod m` 的值。其中,base、exponent、m均为大数类型BigInteger。

modPow方法的签名如下:

public BigInteger modPow(BigInteger exponent, BigInteger m)

该方法返回一个BigInteger对象,表示 `(this^exponent) mod m` 的值,即调用者(即当前对象)的指定次幂对指定模数取余的结果。

以下是一个示例代码片段,说明如何使用modPow方法:``` java

import java.math.BigInteger;

public class ModPowDemo {
    public static void main(String[] args) {
        BigInteger base = new BigInteger("1234567890");
        BigInteger exponent = new BigInteger("9876543210");
        BigInteger m = new BigInteger("1000000007");

        BigInteger result = base.modPow(exponent, m);

        System.out.println(result); //输出:122306075
    }
}

base是基数,exponent是次幂, m是要取余的数。

需要注意的是,如果指定模数m为负数或者0,则会抛出ArithmeticException异常。此外,在计算过程中可能会发生溢出或其他错误情况,因此在实际使用时应该仔细处理可能的异常情况。

(6)Gcd方法

大数的gcd方法就是计算两个大数的最大公约数,可以使用Java中提供的BigInteger类的gcd方法来实现。

以下是一个示例代码片段,展示如何使用BigInteger类的gcd()方法来计算两个大数的最大公约数:

import java.math.BigInteger;

public class GcdDemo {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("1234567890");
        BigInteger b = new BigInteger("9876543210");

        BigInteger gcd = a.gcd(b);

        System.out.println("最大公约数:" + gcd); //输出:最大公约数:360

    }
}

在上述代码中,我们首先创建两个BigInteger对象a和b,并初始化它们的值。然后,我们调用a对象的gcd()方法来计算a和b的最大公约数,并将结果存储在gcd对象中。最后,我们将结果输出到控制台。

需要注意的是,在实际应用中,应该考虑到输入数据较大时可能会发生溢出等问题,因此应该仔细处理可能出现的异常情况。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值