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对象中。最后,我们将结果输出到控制台。
需要注意的是,在实际应用中,应该考虑到输入数据较大时可能会发生溢出等问题,因此应该仔细处理可能出现的异常情况。