【经验】 Java BigInteger类以及其在算法题中的应用

标签(空格分隔): 经验


本来在刷九度的数学类型题,有进制转换和大数运算,故而用到了java BigInteger类,使用了之后才发现真是业界良心!比C++求解进制转换题不知道方便到哪里去了!故作此文。

简介

首先,介绍一下BigIntger类。

BigInteger类是java为了处理大数字二专门制作的类,可以处理很大的数字(理论上无限大),并且可以实现大数字的类似于int所有数学运算。对算法题来说,再也不怕出现超出int范围的运算了!

同时,处理大浮点数的类是BigDecimal。

BigInteger主要能实现以下功能:

  • 大整数的直接读取
  • 大整数加减乘除,求余
  • 求幂,绝对值,求相反数
  • 判断是否相等,求两数的最大值,最小值
  • 求公约数(厉害!)
  • 求某数转成二进数后的位数
  • 判断某个数是否为素数(可能判错)
  • 获取某个数的下一个可能的素数
  • ···

使用

使用时要引入包:

import java.math.BigInteger;

下面是基本的函数与参数介绍。

Ⅰ 基本函数:
1.valueOf(parament); 将参数转换为制定的类型
比如 int a = 3;
BigInteger b = BigInteger.valueOf(a);
则b=3;
String s= "12345";
BigInteger c = BigInteger.valueOf(s);
则c = 12345; 2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a.add(b); 3.subtract(); 相减
4.multiply(); 相乘
5.divide(); 相除取整
6.remainder(); 取余
7.pow(); a.pow(b)=a^b
8.gcd(); 最大公约数
9.abs(); 绝对值
10.negate(); 取反数
11.mod(); a.mod(b)=a%b=a.remainder(b);
12.max(); min();
13.public int comareTo();
14.boolean equals(); 是否相等
15.shiftLeft():左移,this << n ,this*2^n;
shiftRight():右移,this >> n,this/2^n; 16.bitLength:返回该数的最小二进制补码表示的位的个数,即 *不包括* 符号位 (ceil(log2(this <0 ? -this : this + 1)))。对正数来说,这等价于普通二进制表示的位的个数。
17.bitCount:返回该数的二进制补码表示中不包扩符号位在内的位的个数。该方法在 BigIntegers 之上实现位向量风格的集合时很有用。 18.isProbablePrime:如果该 BigInteger 可能是素数,则返回 true ;如果它很明确是一个合数,则返回 false 。 参数 certainty 是对调用者愿意忍受的不确定性的度量:如果该数是素数的概率超过了 1 - 1/2**certainty方法,则该方法返回 true 。执行时间正比于参数确定性的值。
19.nextProbablePrime():获取下一个可能的素数是多少
20.BigInteger构造函数:
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix);
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger

注意

1.其构造方法有很多,常用的邮: BigInteger(String val) 将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger(String val, int radix)将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。

2.进行数学运算时不能直接使用数学运算符进行运算,必须使用其内部方法。而且其操作数也必须为BigInteger型。

3.当要把计算结果输出时应该使用.toString方法将其转换为10进制的字符串:System.out.print(two.toString());

算法使用

大整数基本运算

【九度OJ】题目1198:a+b 解题报告
【九度OJ】题目1076:N的阶乘 解题报告
【九度OJ】题目1190:大整数排序 解题报告

进制转换

我最喜欢的功能,因为直接实现了算法,就不用我写了。可以使用以下函数,转换成字符串后如果存在abc等字符默认的是小写,如果转换成大写可以加上.toUpperCase();

private static String change(String num, int from, int to) {
return new BigInteger(num, from).toString(to);
}

用到这个方法做到的题:

【九度OJ】题目1118:数制转换 解题报告
【九度OJ】题目1138:进制转换 解题报告
【九度OJ】题目1194:八进制 解题报告
【九度OJ】题目1080:进制转换 解题报告
【九度OJ】题目1208:10进制 VS 2进制 解题报告
【九度OJ】题目1473:二进制数 解题报告
【九度OJ】题目1194:八进制 解题报告

最大公约数

利用gcd函数。

【九度OJ】题目1056:最大公约数 解题报告
【九度OJ】题目1438:最小公倍数 解题报告
【九度OJ】题目1439:Least Common Multiple 解题报告

素数

利用isProbablePrime(10),nextProbablePrime().

【九度OJ】题目1047:素数判定 解题报告
【九度OJ】题目1163:素数 解题报告
【九度OJ】题目1040:Prime Number 解题报告
【九度OJ】题目1207:质因数的个数 解题报告

大浮点数

使用BigDecimal类进行同样的解决。
【九度OJ】题目1137:浮点数加法 解题报告

其它

待补充。

参考文献:

java中的BigInteger(很好很强大)(转)
JAVA大数处理(BigInteger,BigDecimal)

【经验】 Java BigInteger类以及其在算法题中的应用的更多相关文章

  1. Java在算法题中的输入问题

    Java在算法题中的输入问题 在写算法题的时候,经常因为数据的输入问题而导致卡壳,其中最常见的就是数据输入无法结束. 1.给定范围,确定输入几个数据 直接使用普通的Scanner输入数据范围,然后使用 ...

  2. 14-03 java BigInteger类,BigDecimal类,Date类,DateFormat类,Calendar类

    BigInteger类 发 package cn.itcast_01; import java.math.BigInteger; /* * BigInteger:可以让超过Integer范围内的数据进 ...

  3. JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中

    处理JSON字符串时,一直出错,写个样例后发现原来是没有弄清楚数据的格式问题. 实现的是 JSONString 转换成java对象 或是 list列表 实例类 News package lyx.ent ...

  4. python在算法题中判断输入结束(EOF)

    有些算法题是这样要求的,一行输入一行数据,然后没有规定我要输入多少行,你要自行判断文件结束EOF,否则是会runtime error的,因为oj内部都是用文件来进行读写的. 例如a+b,每一行输入a ...

  5. java BigInteger类的用法

    import java.math.BigInteger; Scanner in = new Scanner(System.in); BigInteger x1 = new BigInteger(&qu ...

  6. Java写算法题中那些影响你效率的细节(关于暴力破解算法题的细节处理)

    QQ讨论群:99979568 多交流才能进步 暂时写到这里,有不懂的欢迎评论, 如果有什么其他提高效率的细节,欢迎评论或者私信我,小编一定努力学习,争取早日分享给大家 如果大家嫌三连累的话,可以看看这 ...

  7. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  8. LeetCode算法题-Kth Largest Element in a Stream(Java实现)

    这是悦乐书的第296次更新,第315篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第164题(顺位题号是703).设计一个类来查找流中第k个最大元素.请注意,它是排序顺序 ...

  9. LeetCode算法题-Valid Palindrome II(Java实现)

    这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680).给定非空字符串s,最多可以删除一个字符. 判断它是否是回 ...

随机推荐

  1. C语言计算fastq文件GC含量

    C语言小练习:计算非压缩fastq格式的GC含量 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <strin ...

  2. Java 好用的东西

    Java自带的一些好用的东西: 求一个数的每一位:(toCharArray) int i = 10;char[] s = String.valueOf(i).toCharArray(); 十进制转二进 ...

  3. academy

    academy at/in school都行,academy一般用at. The word comes from the Academy in ancient Greece, which derive ...

  4. 关于redis HSCAN count参数不生效的问题

    这的确是个坑,HSCAN是为了处理大量数据而设计的,可能也是因为这个原因,在数据量较少的情况下count参数并不会生效,具体阈值是多少并没有实际测验过不过可以断定的是一百条数据一下估计是不会生效的.

  5. 关于learning Spark中文版翻译

      在网上找了很久中文版,感觉都是需要支付一定金币才能下载,索性自己翻译算了.因为对Spark有一定了解,而且书籍前面写道,对Spark了解可以直接从第三章阅读,就直接从第三章开始翻译了,应该没有什么 ...

  6. innodb和myisam对比及索引原理区别

    InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了 1.事务和外键 InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版 ...

  7. Activity 详解

    1.活动的生命周期 1.1.返回栈 Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈.栈是一种先进后出的数据结构,在默认情况下,每当我们启 ...

  8. ORACLE 获取执行计划的方法

    一.获取执行计划的6种方法(详细步骤已经在每个例子的开头注释部分说明了): 1. explain plan for获取: 2. set autotrace on : 3. statistics_lev ...

  9. layui 弹窗中 分页展示table

    1. 需求:点击查看更多,展示该类别 所有数据,并分页 2. 参考文档: (1)https://www.jianshu.com/p/40da11ebae66 (2) https://blog.csdn ...

  10. 【编程思想】【设计模式】【行为模式Behavioral】策略模式strategy

    Python版 转自https://github.com/faif/python-patterns/blob/master/behavioral/strategy.py #!/usr/bin/env ...