5.算法竞赛中的常用JAVA API :大数类

摘要

java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1

对应的十进制数是9223372036854775807(long类型的最大值),也就是说只要运算过程中会超过这个数,就会造成数据溢出,从而造成错误.

  1. 而java.math.*包中提供了大数类,其理论上可以存储无限位的大数,只要内存足够的话。
  2. 大数类又分为整数和浮点数.即BigInteger and BigDecimal
  3. 大数类的对象不能直接进行运算,需要调用类中相应的方法,并且方法的参数必须和调用的类相同,BigInteger不能调用BigDecimal, 不能作为其方法参数, 即整数和浮点数不能混合运算.
  4. 本文举例了一些常用的方法,不需要背会,需要用的时候查java API就行了。

BigInteger 和 BigDecimal

创建

  1. //1.直接声明
  2. BigInteger a;
  3. BigDecimal b;
  4. //2.使用构造函数初始化
  5. BigInteger a = new BigInteger("123456789101112131415");
  6. BigDecimal b = new BigDecimal("123456.123456");

赋值

BigInteger.valueOf(long val);

BigDecimal.valueOf(double val);

  1. BigInteger a;
  2. BigDecimal b;
  3. //注意 val 不能超过 long 类型的最大取值9223372036854775807, 超过int时要在数后面加L如:
  4. a = BigInteger.valueOf(123456789101112L); //大于int范围的要加L
  5. b = BigDecimal.valueOf(123456.12341235); // 超出的小数位数会自动舍弃

使用 = 将同类型变量的值赋给另一个变量

  1. BigInteger a;
  2. BigInteger b = new BigInteger("123456");
  3. a = b;
  4. System.out.print(a);
  5. 输出:
  6. 123456

加法

BigInteger.add(BigInteger);

BigDecimal.add(BigDecimal);

  1. BigInteger a, b, c;
  2. a = BigInteger.valueOf(123456789); // 赋值为 123456789
  3. b = BigInteger.valueOf(987654321); // 赋值为 987654321
  4. c = a.add(b);
  5. System.out.print(c);
  6. 输出:
  7. 1111111110
  8. 1111111110

减法

BigInteger.subtract(BigInteger);

BigDecimal.sbutract(BigDecimal);

  1. BigInteger a, b, c;
  2. a = BigInteger.valueOf(123456789); // 赋值为 123456789
  3. b = BigInteger.valueOf(987654321); // 赋值为 987654321
  4. c = a.subtract(b);
  5. System.out.print(c);
  6. 输出:
  7. -864197532

乘法

BigInteger.multiply(BigInteger);

BigDecimal.multiply(BigDecimal);

  1. BigInteger a, b, c;
  2. a = BigInteger.valueOf(123456789); // 赋值为 123456789
  3. b = BigInteger.valueOf(987654321); // 赋值为 987654321
  4. c = a.multiply(b);
  5. System.out.print(c);
  6. 输出:
  7. 121932631112635269

除法

BigInteger.divide(BigInteger);

BigDecimal.divide(BigDecimal);

  1. BigInteger a, b, c;
  2. a = BigInteger.valueOf(987654321); // 赋值为 987654321
  3. b = BigInteger.valueOf(123456789); // 赋值为 123456789
  4. c = a.divide(b); // 整数相除仍为整数
  5. System.out.print(c);
  6. 输出:
  7. 8

取余

BigInteger.mod(BigInteger);

  1. BigInteger a, b, c;
  2. a = BigInteger.valueOf(987654321); // 赋值为 987654321
  3. b = BigInteger.valueOf(123456789); // 赋值为 123456789
  4. c = a.mod(b);
  5. System.out.print(c);
  6. 输出:
  7. 9

求最大公因数

BigInteger.gcd(BigInteger);

  1. BigInteger a, b, c;
  2. a = BigInteger.valueOf(987654321); // 赋值为 987654321
  3. b = BigInteger.valueOf(123456789); // 赋值为 123456789
  4. c = a.gcd(b);
  5. System.out.print(c);
  6. 输出:
  7. 9

求最值

BigInteger.max(BigInteger) , BigDecimal.max(BigDecimal) 最大值

BigInteger.min(BigInteger) , BigDecimal.min(BigDecimal) 最小值

  1. BigInteger a, b, c, d;
  2. a = BigInteger.valueOf(987654321); // 赋值为 987654321
  3. b = BigInteger.valueOf(123456789); // 赋值为 123456789
  4. c = a.max(b); //a,b中的最大值
  5. d = a.min(b); //a,b中的最小值
  6. System.out.println(c);
  7. System.out.println(d);
  8. 输出:
  9. 987654321
  10. 123456789

(a^b)%mod

BigInteger.modPow(BigInteger, BigInteger);

  1. BigInteger a, b, c, mod;
  2. a = BigInteger.valueOf(987654321); // 赋值为 987654321
  3. b = BigInteger.valueOf(123456789); // 赋值为 123456789
  4. mod = BigInteger.valueOf(10007);
  5. c = a.modPow(b, mod); //(a^b)%mod
  6. System.out.println(c);
  7. 输出:
  8. 718

比较大小

BigInteger.compareTo(BigInteger);

BigDecimal.compareTo(BigDecimal);

  1. BigInteger a, b;
  2. int c;
  3. a = BigInteger.valueOf(987654321); // 赋值为 987654321
  4. b = BigInteger.valueOf(123456789); // 赋值为 123456789
  5. c = a.compareTo(b); // a 和 b
  6. System.out.println(c);
  7. c = b.compareTo(b); // b 和 b
  8. System.out.println(c);
  9. c = b.compareTo(a); // c 和 c
  10. System.out.println(c);
  11. 输出:
  12. 1
  13. 0
  14. -1
  1. 可见, 对于a.compareTo(b), ab进行比较如果:
  2. a > b 返回 1
  3. a == b 返回 0
  4. a < b 返回-1

进制转化

使用构造函数BigInteger(String, int index);可以把一个index进制的字符串,转化为10进制的BigInteger;

  1. BigInteger a = new BigInteger("111110", 2);把111110变为10进制赋值给a
  2. System.out.println(a.toString(16));把a转化为16进制的字符串输出

类型转化

BigDecimal.toBigInteger() //把BigDecimal 转化为 BigInteger

  1. BigInteger a = new BigInteger(1);
  2. BigDecimal b = new BigDecimal(2);
  3. b.toBigInteger(); // 把BigDecimal转为BigInteger

BigDecimal的精度问题

BigDecimal的舍入模式

想象一个数轴,从负无穷到正无穷,向哪舍入,就是趋向于哪, 向0就是舍入后要更趋近于0.

ROUND_DOWN 向零舍入。 即1.55 变为 1.5 , -1.55 变为-1.5

ROUND_CEILING 向正无穷舍入. 即 1.55 变为 1.6 , -1.55 变为 -1.5

ROUND_FLOOR 向负无穷舍入. 即 1.55 变为 1.5 , -1.55 变为 -1.6

ROUND_HALF_UP 四舍五入 即1.55 变为1.6, -1.55变为-1.6

ROUND_HALF_DOWN 五舍六入 即 1.55 变为 1.5, -1.5变为-1.5

ROUND_HALF_EVEN 如果舍入前一位的数字为偶数,则采用HALF_DOWN奇数则采用HALF_UP 如1.55 采用HALF_UP 1.45采用HALF_DOWN

ROUND_UP 向远离0的方向舍入 即 1.55 变为 1.6 , -1.55 变为-1.6

ROUND_UNNECESSARY 有精确的位数时,不需要舍入

在需要精确舍入的方式时可以使用以上的舍入模式。

(另:Math 类的 ceil()和 floor方法对应普通浮点型的上取整和下取整.)

BigDecimal进行加减乘除时可以进行舍入

如 除法

divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 返回一个

BigDecimal ,其值为 (this / divisor) ,其小数位数为scale。

  1. import java.math.*;
  2. import java.util.*;
  3. import java.io.*;
  4. public class Main{
  5. public static void main(String[] args){
  6. BigDecimal a, b, c;
  7. a = BigDecimal.valueOf(1.51);
  8. b = BigDecimal.valueOf(1.37);
  9. c = a.divide(b,100,BigDecimal.ROUND_DOWN);//采用向0舍入并并保留100位小数
  10. System.out.println(c);
  11. }
  12. }
  13. 输出:
  14. 1.1021897810218978102189781021897810218978102189781021897810218978102189781021897810218978102189781021

保留n位小数

setScale(int newScale, RoundingMode roundingMode);

  1. import java.math.*;
  2. import java.util.*;
  3. import java.io.*;
  4. public class Main{
  5. public static void main(String[] args){
  6. BigDecimal a = new BigDecimal("1.10218");
  7. a = a.setScale(4,BigDecimal.ROUND_HALF_UP);//四舍五入保留四位小数
  8. System.out.println(a);
  9. }
  10. }

注:转载于 https://blog.csdn.net/GD_ONE/article/details/104061907

算法竞赛中的常用JAVA API :大数类(转载)的更多相关文章

  1. 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)

    算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...

  2. 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)

    算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...

  3. 算法竞赛中的常用JAVA API :HashMap 和 TreeMap(转载)

    算法竞赛中的常用JAVA API :HashMap 和 TreeMap 摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实 ...

  4. 8.算法竞赛中的常用JAVA API :Calendar日期类

    8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...

  5. 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)

    7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...

  6. 6.算法竞赛中的常用JAVA API :Math类(转载)

    6.算法竞赛中的常用JAVA API :Math类 求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double ...

  7. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

  8. 常用JAVA API :String 、StringBuilder、StringBuffer的常用方法和区别

    摘要 本文将介绍String.StringBuilder类的常用方法. 在java中String类不可变的,创建一个String对象后不能更改它的值.所以如果需要对原字符串进行一些改动操作,就需要用S ...

  9. eclipse 中使用中文JAVA api文档

    http://hi.baidu.com/danghj/item/7625a1be20946e43ba0e1202在eclipse中使用中文JAVA api文档Sun 官方的中文版 Java API 文 ...

随机推荐

  1. 浅读tomcat架构设计之tomcat容器Container(3)

    浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html 浅读tomcat架构设计之tom ...

  2. JDBC:Connection.close()

    https://www.2cto.com/database/201501/369246.html Connection对象在执行close() 方法之后,并不是直接把Connection对象设置为nu ...

  3. 一千个不用 Null 的理由!

    港真,Null 貌似在哪里都是个头疼的问题,比如 Java 里让人头疼的 NullPointerException,为了避免猝不及防的空指针异常,千百年来程序猿们不得不在代码里小心翼翼的各种 if 判 ...

  4. bash的RANDOM变量生成的是真正的随机数吗

    static void seedrand () { struct timeval tv; gettimeofday (&tv, NULL); sbrand (tv.tv_sec ^ tv.tv ...

  5. 判断字符串是否为ip地址----python

    def isIp(ip_str): flag = True if '.' not in ip_str: return False if ip_str.count('.')!=3 : return Fa ...

  6. libzip开发笔记(二):libzip库介绍、ubuntu平台编译和工程模板

    前言   Qt使用一些压缩解压功能,选择libzip库,libzip库比较原始,也是很多其他库的基础支撑库,编译过了windows版本,有需求编译一个ubuntu版本的,交叉编译需求的同样可参照本文章 ...

  7. IP地址与子网化分

    IP地址与子网掩码 一.IP地址的组成 二.IP地址的分类                            1)A.B.C三类地址的组成                            2 ...

  8. final修饰符(4)-"宏替换"

    对于一个final变量来说,不管它时类变量,实例变量还是局部变量,只要满足三个条件,这个final变量就不再是一个变量,而是一个直接量.final变量的一个重要用途,就是定义"宏变量&quo ...

  9. MapReduce学习总结之架构

    一.MapReduce1.x架构 1)jobTracker:JT 作业的管理者 将作业分解成一堆任务:Task(MapTask和ReduceTask) 将任务分派给TaskTracker(TT)运行 ...

  10. sql-3-DML_DQL

    DML-操作数据 1.insert语句 --增加一行数据 insert into 表名([字段1,字段2,字段3,...])values('值1','值2','值3',...); insert int ...