【经验】 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. 比对软件Blast,Blast+,Diamond比较

    1. Blast (1)格式化数据库 formatdb -i db.seq -p T -o T -l logfile 主要参数: -i 输入需要格式化的源数据库名称 -p 文件类型,是核苷酸序列数据库 ...

  2. Docker将容器制作成镜像并提交到远程仓库

    Docker将容器制作成镜像并提交到远程仓库 步骤如下 先在dockerhub上创建一个自己的用户https://hub.docker.com/.或者在阿里云也可以. 2. 然后先创建一个空的镜像名. ...

  3. 内网穿透—使用 frp 实现内外网互通

    前言 什么是内网穿透? 内网穿透,又叫 NET 穿透,是计算机用语.用通俗的说法就是你家里的个人电脑,可以直接被外网的人访问.例如你在公司,不通过远程工具,直接也可以访问到家里的电脑(本文章特指 we ...

  4. E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing

    解决办法:apt-get update或者apt-get cleanapt-get update 或者 apt-get update --fix-missing问题解析1 source本身的问题 根据 ...

  5. Angular @ViewChild,Angular 中的 dom 操作

    Angular 中的 dom 操作(原生 js) ngAfterViewInit(){ var boxDom:any=document.getElementById('box'); boxDom.st ...

  6. Maven 学习第一步[转载]

    转载至:http://www.cnblogs.com/haippy/archive/2012/07/04/2576453.html 什么是 Maven?(摘自百度百科) Maven是Apache的一个 ...

  7. C++最小内积

    Description 向量是几何中的一个重要概念. 考虑两个向量 v1=(x1,x2,...,xn)和v2=(y1,y2,...,yn),向量的内积定义为 x1y1+x2y2+...+xnyn 例如 ...

  8. Output of C++ Program | Set 17

    Predict the output of following C++ programs. Question 1 1 #include <iostream> 2 using namespa ...

  9. 为Python的web框架编写前端模版的教程

    虽然我们跑通了一个最简单的MVC,但是页面效果肯定不会让人满意. 对于复杂的HTML前端页面来说,我们需要一套基础的CSS框架来完成页面布局和基本样式.另外,jQuery作为操作DOM的JavaScr ...

  10. 【Linux】【Services】【Project】Cobbler自动化装机

    1. 概念 1.1. Cobbler 1.2. PXE 1.3. 2. 版本信息 2.1. OS:Red Hat Enterprise Linux Server release 7.3 (Maipo) ...