BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。
BigInteger不是基本数据类型之一,它其实更像String,是Java里的一个类,然而它的初始化方式却没有String那么方便可以直接赋值,而是跟其他自定义的类一样,要调用它的构造器进行初始化。
这个类的取值范围原则上是没有上限的,取决于你的计算机的内存。
BigInteger构造器
可以直接将十进制的字符串格式变成大整数,举例:
BigInteger a=new BigInteger(“2222222222222222”);
BigInteger 与 int 之间是不能直接相互转化的!BigInteger型只能与BigInteger型进行运算;
// 朱茂强 qq:896228072
public static void main(String[] args){
4 //int 与 BigInteger之间的正确转换方法:
5 //int 转换为 BigInteger的方法:
6 int p = 1;
7 BigInteger a = BigInteger.valueOf(p);
8
9
10 //BigInteger 转换为 int的方法:
11 BigInteger d = new BigInteger("9");
12 int temp = d.intValue();*/
13 }
14 }
既然不是基本数据类型,所以大数的加减乘除也不能使用+、-、*、/这些运算符号,Java也没有对这些运算符号进行重定义,取而代之的是用一些方法来代替,比如add()、subtract()、mutiply()、divide()这四种方法,它们的使用举例如下:
基本运算
返回值为BigInteger类
import java.math.*;//此处不清楚具体调用哪个方法用*代替
public class zmq{
//基本运算:add(),subtract(),multiply(),divide(),mod(),remainder(),pow(),abs(),negate()
@Test
public void testBasic() {
BigInteger a = new BigInteger("13");
BigInteger b = new BigInteger("4");
int n = 3;
//1.加
BigInteger bigNum1 = a.add(b); //17
//2.减
BigInteger bigNum2 = a.subtract(b); //9
//3.乘
BigInteger bigNum3 = a.multiply(b); //52
//4.除
BigInteger bigNum4 = a.divide(b); //3
//5.取模(需 b > 0,否则出现异常:ArithmeticException("BigInteger: modulus not positive"))
BigInteger bigNum5 = a.mod(b); //1
//6.求余
BigInteger bigNum6 = a.remainder(b); //1
//7.平方(需 n >= 0,否则出现异常:ArithmeticException("Negative exponent"))
BigInteger bigNum7 = a.pow(n); //2197
//8.取绝对值
BigInteger bigNum8 = a.abs(); //13
//9.取相反数
BigInteger bigNum9 = a.negate(); //-13
}
比较大小
compareTo()返回一个int型数据:1 大于; 0 等于; -1 小于;
max(),min():分别返回大的(小的)那个BigInteger数据;
//比较大小:compareTo(),max(),min()
@Test
public void testCompare() {
BigInteger bigNum1 = new BigInteger("52");
BigInteger bigNum2 = new BigInteger("27");
//1.compareTo():返回一个int型数据(1 大于; 0 等于; -1 小于)
int num = bigNum1.compareTo(bigNum2); //1
//2.max():直接返回大的那个数,类型为BigInteger
// 原理:return (compareTo(val) > 0 ? this : val);
BigInteger compareMax = bigNum1.max(bigNum2); //52
//3.min():直接返回小的那个数,类型为BigInteger
// 原理:return (compareTo(val) < 0 ? this : val);
BigInteger compareMin = bigNum1.min(bigNum2); //27
}
类型转换
将BigInteger数据转换成基本数据类型,还可以转换成radix进制的字符串形式;
// An highlighted block
//类型转换(返回类型如下)
@Test
public void testToAnother() {
BigInteger bigNum = new BigInteger("52");
int radix = 2;
//1.转换为bigNum的二进制补码形式
byte[] num1 = bigNum.toByteArray();
//2.转换为bigNum的十进制字符串形式
String num2 = bigNum.toString(); //52
//3.转换为bigNum的radix进制字符串形式
String num3 = bigNum.toString(radix); //110100
//4.将bigNum转换为int
int num4 = bigNum.intValue();
//5.将bigNum转换为long
long num5 = bigNum.longValue();
//6.将bigNum转换为float
float num6 = bigNum.floatValue();
//7.将bigNum转换为double
double num7 = bigNum.doubleValue();
}
权限控制
setBit(),testBit():可用于菜单的权限控制,非常好用,原理如下:
// An highlighted block
//权限控制:setBit(),testBit()
@Test
public void testSetAndTest() {
//1.封装数据(setBit的值需 >= 0,否则出现异常:ArithmeticException("Negative bit address"))
BigInteger permission = new BigInteger("0");
BigInteger numBig = permission.setBit(2);
numBig = numBig.setBit(5);
numBig = numBig.setBit(13);
numBig = numBig.setBit(66);
System.out.println("原理:" + numBig);
// 原理:73786976294838214692 = 2^2+2^5+2^13+2^66 次方的和;
// 看!!即使这么大的数也不会溢出,而int最大值只有2147483647;
//2.取值验证(返回Boolean型)
boolean flag1 = numBig.testBit(2); //true
boolean flag2 = numBig.testBit(5); //true
boolean flag3 = numBig.testBit(13); //true
boolean flag4 = numBig.testBit(66); //true
boolean flag5 = numBig.testBit(27); //false
}
小结
BigInteger也是不可变的,在进行每一步运算时,都会产生一个新的对象。都会产生一个新的对象。发生异常算术条件时,会抛出ArithmeticException异常。例如,一个整数除以“0”,会抛出一个这个类的实例;
假设计算一个int数据平方与另一个大小的问题,很可能会内存溢出。除了使用二分法外,利用BigInteger的compareTo方法也是一个好选择,简单易懂,而且不需要算法支持;
本章作为笔记使用,内容比较全面,但常用的只有:构造函数,基本运算以及compareTo(),intValue(),setBit(),testBit()方法;
setBit()和testBit()方法可用于菜单的权限控制,小编在开发中多次尝试,非常好用。很多微博有相关介绍,在这里我不做项目演示了。
// 实例应用
标题:外星日历
某星系深处发现了文明遗迹。
他们的计数也是用十进制。
他们的文明也有日历。日历只有天数,没有年、月的概念。
有趣的是,他们也使用了类似“星期”的概念,
只不过他们的一个星期包含了9天,
为了方便,这里分别记为: A,B,C…H,I
从一些资料上看到,
他们的23日是星期E
他们的190日是星期A
他们的343251日是星期I
令人兴奋的是,他们居然也预见了“世界末日”的那天,
当然是一个很大很大的数字
651764141421415346185
请你计算一下,这遥远的一天是该文明的星期几?
你需要提交的是一个大写字母,表示该文明的星期几,
不要填写任何多余的内容。
// An highlighted block
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
BigInteger n;
n = input.nextBigInteger();
BigInteger b = new BigInteger("9");
BigInteger ans = n.mod(b);
switch (ans.intValue()) {//将BigInteger数据转换成int型;
case 1:
System.out.println("A");
break;
case 2:
System.out.println("B");
break;
case 3:
System.out.println("C");
break;
case 4:
System.out.println("D");
break;
case 5:
System.out.println("E");
break;
case 6:
System.out.println("F");
break;
case 7:
System.out.println("G");
break;
case 8:
System.out.println("H");
break;
default:
System.out.println("I");
break;
}
}
}
//也可以用数组解决
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
BigInteger n;
n = input.nextBigInteger();
BigInteger b = new BigInteger("9");// 该星球一个星期有9天
BigInteger ans = n.mod(b);
char arr[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
if (ans.intValue() != 0)
System.out.print(arr[ans.intValue() - 1]);
else
System.out.println("I");
}
}