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


常用的就上面这些啦









目录
相关文章
|
3天前
|
Java
Java中的抽象类:深入了解抽象类的概念和用法
Java中的抽象类是一种不能实例化的特殊类,常作为其他类的父类模板,定义子类行为和属性。抽象类包含抽象方法(无实现)和非抽象方法。定义抽象类用`abstract`关键字,子类继承并实现抽象方法。抽象类适用于定义通用模板、复用代码和强制子类实现特定方法。优点是提供抽象模板和代码复用,缺点是限制继承灵活性和增加类复杂性。与接口相比,抽象类可包含成员变量和单继承。使用时注意设计合理的抽象类结构,谨慎使用抽象方法,并遵循命名规范。抽象类是提高代码质量的重要工具。
40 1
|
3天前
|
前端开发 Java
java中的Queue队列的用法
java中的Queue队列的用法
21 1
|
3天前
|
XML Java 编译器
java aspectjrt AOP 用法
java aspectjrt AOP 用法
30 0
|
3天前
|
Java
Java中return的两种用法
Java中return的两种用法
|
1天前
|
Java
Java8 Stream 用法合集
Java8 Stream 用法合集
|
1天前
|
Java 程序员
Java this关键字详解(3种用法),Java程序员面试必备的知识点
Java this关键字详解(3种用法),Java程序员面试必备的知识点
|
3天前
|
SQL Java
【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍
【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍
|
3天前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
10 0
|
3天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
22 2