梅森素数
梅森素数
题干
代码
package aJAVA13;
/*
* 2^11213 - 1 这个数字已经很大(有3000多位),
* 请你编程求出这个素数的十进制表示的最后100位。
* */
import java.math.BigInteger;
public class _03梅森素数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
BigInteger x = BigInteger.valueOf(2).pow(11213).subtract(BigInteger.ONE);
String s = x.toString();
int length = s.length();
String ans = s.substring(length-100);
System.out.println(ans.length()+ " "+ans);
}
}
总结:
1.BigInteger(理解)
介绍
不可变的任意精度的整数。数据的范围超过了long类型后,可以使用BigInteger类实现,该类的计算整数是不限制长度的。
该类内部提供了加减乘除的方法
构造方法
public BigInteger (String num);
成员方法
BigInteger 类型的数据不能直接使用 +/-/* 操作, 需要通过内部提供的方法
每一个大整数都需要new 一个BigInteger对象, 赋值给对象变量,用传参方法来进行计算
BigInteger 可以用来解决数据的溢出问题。
BigInteger的常用用法:
1。probablePrime和nextprobablePrime。(判断质数,并返回)
BigInteger.probablePrime(int x);
返回有可能是素数(质数),具有指定长度的正数BigInteger,返回可能是合数的概率不超过2的负100次方,
BigInteger.nextprobablePrime(int x)
返回大于此BigInteger的有可能是素数(质数),具有指定长度的正数BigInteger,返回可能是合数的概率不超过2的负100次方,
2.valueOf()(对数据初始化)
BigInteger valueOf(long val)
用法如下:
3四则运算(add(加)。subtract(减)。multiply(乘)。divide(除))
调用方式如上图,可以重复调用
4remainder(取余)
返回其值为取余后的BigInteger类型的值,例子如下
调用的时候要保证数据是BigInteger类型的,可以用初始化(valueOf)或者new一个。
5.divideAndRemainder(先除后取余,结果分别存在数组中)
2.BigDecimal类
介绍
计算机在计算小数时, 使用 + / - /* 的操作, 其精度有问题
对于小数的运算,我们需要使用 BigDecimal类类型
概述
此类是做高精度的浮点数运算的
构造方法
常用方法
注意
如果除不尽, 会抛出异常java.lang.ArithmeticException异常
可以使用
divide方法的另一个重载方法;
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode): divisor:除数对应的BigDecimal对象; 参数说明:scale:精确的位数;roundingMode取舍模式
取舍模式四舍五入可以输入 RoundingMode.HALF_UP
length()是最大的下标+1
想要最后一百个就是length-100
4.做题技巧
不确定是不是一百位,可以输出一下长度
System.out.println(ans.length()+ " "+ans);