Java大数BigInteger-用法记录

简介: Java大数BigInteger-用法记录提交代码使用方式构造一个对象加 add减 subtract乘 multiply除 dividegcd 最大公约数lcm 最小公倍数mod %pow ^次方abs 绝对值开方sqrtmodPow 次方取余equals判断是否相等compareTo 比较大小常用的就上面这些啦

Java大数BigInteger-用法记录


在处理数据比较大的题目的时候,并且不允许提交python代码的情况下,可以采用Java大数来进行处理

由于Java的内存回收机制等方面的原因,会导致Java的时间限制比其它语言的要大一些,一般情况下是其它语言的两倍

比如说有这么一个题:

841332767fbb48c5a89b2f81bb1d7774.png

判断两个数那个大那个小,聪明的小朋友就用小学的知识将分母乘上去,但是看一眼数据范围的话,1e18 * 1e9是行不通的,当然这个题也可以用模拟的方式来进行处理,但是这里用Java大数的方式来处理一下

Java的大数分为两种,一种是整数类型的,一种是小数类型的BigDecimal,一种是整数类型的BigInteger

本篇文章就讲一下Java中BigInteger的使用


提交代码


  1. 在提交Java代码的时候,不能含有导入的包package的名字
  2. 在新建Java类的过程中,一般情况下要将类命名为Main 否则再提交代码之后会报错
  3. 提交的代码中一定要有
import java.math.BigInteger;
import java.util.Scanner;


这种代码,其中第一个是BigInteger 所在的jar 包

对于上面这道题的代码,可以提交为:


import java.math.*;
import java.util.*;
public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
          long x = sc.nextLong();
          long a = sc.nextLong();
          long y = sc.nextLong();
          long b = sc.nextLong();
          BigInteger xx = BigInteger.valueOf(x);
          BigInteger aa = BigInteger.valueOf(a);
          BigInteger yy = BigInteger.valueOf(y);
          BigInteger bb = BigInteger.valueOf(b);
          if(xx.multiply(bb).compareTo(yy.multiply(aa)) == 1) System.out.println(">");
          else if(xx.multiply(bb).compareTo(yy.multiply(aa)) == -1) System.out.println("<");
          else System.out.println("=");
        }
  }
}


使用方式


构造一个对象


常用的有两种方式,一种是用字符串构造出来,一种是用long类型的证书构造出来

BigInteger a = new BigInteger("123");
BigInteger b = BigInteger.valueOf(456);


对于要输入的一个BigInteger类型的数,则可以采用如下方式进行构造出来

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger c = cin.nextBigInteger();
    }
}


加 add


a = a.add(b);


减 subtract


a = a.subtract(b);
• 1


乘 multiply


a = a.multiply(b);
• 1


除 divide


a = a.divide(b);
• 1


对于上面的总共的代码:

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        BigInteger c = cin.nextBigInteger();
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        a = a.add(b);
        System.out.println(a);
        a = a.subtract(b);
        System.out.println(a);
        a = a.multiply(b);
        System.out.println(a);
        a = a.divide(b);
        System.out.println(a);
    }
}

7c787773a9464b95b0784cfd101e9ae2.png


在输入了789之后,可以见到如下的加减成熟之后的结果

一定要注意在操作的过程中不要忘记对一个数重新赋值

比如在要将a * b的时候,一定要写

a = a.multiply(b);


而不是

a.multiply(b);


这样不会报错,但是并没有改变变量a的值


gcd 最大公约数


import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        BigInteger gcd = a.gcd(b);
        System.out.println(gcd);
    }
}///对应输出为3


lcm 最小公倍数


a * b == gcd(a,b) * lcm(a,b)


mod %


import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        BigInteger mod = a.mod(BigInteger.valueOf(11));
        System.out.println(mod);
    }
}


pow ^次方


import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        BigInteger pow = a.pow(2);
        System.out.println(pow);
    }
}

e1e9b69c4e6c486da5f5b9bbbe7b8aff.png


abs 绝对值


import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        a = a.multiply(BigInteger.valueOf(-1));
        System.out.println(a);
        a = a.abs();
        System.out.println(a);
    }
}


对应输出为:

60d09fe7e62d47809ae5f052e09ca0cf.png


开方sqrt


import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        a =  a.sqrt();
        System.out.println(a);
    }
}


对应输出为:

c6194391369c416eb01d5928193ca04d.png


modPow 次方取余


import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        a = a.modPow(BigInteger.valueOf(2),BigInteger.valueOf(100));
        System.out.println(a);
    }
}


对应输出为:

675f8bb835da484dbb727b709d3598e8.png


equals判断是否相等


import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        if(a.equals(b)) System.out.println("1: equal");
        else System.out.println("1: not equal");
        a = BigInteger.valueOf(456);
        if(a.equals(b)) System.out.println("2: equal");
        else System.out.println("1: not equal");
    }
}


对应输出为:

c660787410fd40d69889811652dfe019.png


compareTo 比较大小


import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        BigInteger a = new BigInteger("123");
        BigInteger b = BigInteger.valueOf(456);
        int flag = 0;
        flag = a.compareTo(b);
        System.out.println("a:" + a + "--" + b + "  " + flag);
        a = b;
        flag = a.compareTo(b);
        System.out.println("a:" + a + "--" + b + "  " + flag);
        b = BigInteger.valueOf(123);
        flag = a.compareTo(b);
        System.out.println("a:" + a + "--" + b + "  " + flag);
    }
}


对应输出为:

85f37739e65d41c2a0360556ee3a7acb.png


前一个数大于后面的数 结果为1

两数相等返回结果为0

后面的数大于前面的数 结果为-1


常用的就上面这些啦









目录
相关文章
|
4月前
|
Java
Java中的equals()与==的区别与用法
【7月更文挑战第28天】
72 12
|
30天前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
2月前
|
Java
Java 正则表达式高级用法
Java 中的正则表达式是强大的文本处理工具,用于搜索、匹配、替换和分割字符串。`java.util.regex` 包提供了 `Pattern` 和 `Matcher` 类来高效处理正则表达式。本文介绍了高级用法,包括使用 `Pattern` 和 `Matcher` 进行匹配、断言(如正向和负向前瞻/后顾)、捕获组与命名组、替换操作、分割字符串、修饰符(如忽略大小写和多行模式)及 Unicode 支持。通过这些功能,可以高效地处理复杂文本数据。
|
2月前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
|
2月前
|
安全 Java
Java switch case隐藏用法
在 Java 中,`switch` 语句是一种多分支选择结构,常用于根据变量值执行不同代码块。除基本用法外,它还有多种进阶技巧,如使用字符串(Java 7 开始支持)、多个 `case` 共享代码块、不使用 `break` 实现 “fall-through”、使用枚举类型、使用表达式(Java 12 及以上)、组合条件以及使用标签等。这些技巧使代码更加简洁、清晰且高效。
|
3月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
48 2
|
4月前
|
Java
java中return,break以及continue的用法
java中return,break以及continue的用法
47 10
|
5月前
|
Java
深入理解 Java 8 函数式接口:定义、用法与示例详解
深入理解 Java 8 函数式接口:定义、用法与示例详解
305 2
|
5月前
|
Java
Java 中 MessageFormat.format 用法
Java 中 MessageFormat.format 用法
68 1
|
5月前
|
Java API 容器
Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法
【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。
77 4
下一篇
无影云桌面