BigInteger方法-------------满足无限位数的数之间的运算

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");
	}

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱茂强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值