蓝桥杯A 梅森素数

标题: 梅森素数

如果一个数字的所有真因子之和等于自身,则称它为“完全数”或“完美数”

例如:6 = 1 + 2 + 3

28 = 1 + 2 + 4 + 7 + 14

早在公元前300多年,欧几里得就给出了判定完全数的定理:

若 2^n - 1 是素数,则 2^(n-1) * (2^n - 1) 是完全数。

其中 ^ 表示“乘方”运算,乘方的优先级比四则运算高,例如:2^3 = 8, 2 * 2^3 = 16, 2^3-1 = 7

但人们很快发现,当n很大时,判定一个大数是否为素数到今天也依然是个难题。

因为法国数学家梅森的猜想,我们习惯上把形如:2^n - 1 的素数称为:梅森素数。

截止2013年2月,一共只找到了48个梅森素数。 新近找到的梅森素数太大,以至于难于用一般的编程思路窥其全貌,所以我们把任务的难度降低一点:

1963年,美国伊利诺伊大学为了纪念他们找到的第23个梅森素数 n=11213,在每个寄出的信封上都印上了“2^11213-1 是素数”的字样。

2^11213 - 1 这个数字已经很大(有3000多位),请你编程求出这个素数的十进制表示的最后100位。

答案是一个长度为100的数字串,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。

8586718527586602439602335283513944980064327030278104224144971883680541689784796267391476087696392191

使用Java中大整数类来求解:

说明:<<运算符把expression1的所有位向左移expression2指定的位数。例如:
var temp temp = 14 << 2 变量temp的值为 56,因为 14 (即二进制的 00001110)向左移两位等于 56 (即二进制的 00111000)。
简单介绍一种方便计算的方法:
8 << 1的值为82=16;
8 << 2的值为8
(2^2)=32;
8 << n的值为8*(2^n)

public class MeiShengSuShu
{
public static void main(String[] args)
{
//生成大整数对象
BigInteger bn = new BigInteger(“2”);

//进入次方循环
for(int i = 1; i < 11213; i++)
{
bn = bn.shiftLeft(1);
}

//将结果减1
BigInteger one = new BigInteger("1");
bn = bn.subtract(one);

//类型转换
String str = bn+"";

//截取最后100位
str = str.substring(str.length()-100);

//输出
System.out.println(str);
}  

}

public String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾。

猜你喜欢

转载自blog.csdn.net/weixin_43695712/article/details/87915068