题目描述
形如2^{P}-12
P
−1的素数称为麦森数,这时PP一定也是个素数。但反过来不一定,即如果PP是个素数,2^{P}-12
P
−1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入PP(1000<P<31000001000<P<3100000),计算2^{P}-12
P
−1的位数和最后500位数字(用十进制高精度数表示)
输入格式
文件中只包含一个整数PP(1000<P<31000001000<P<3100000)
输出格式
第一行:十进制高精度数2^{P}-12
P
−1的位数。
第2-11行:十进制高精度数2^{P}-12
P
−1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2^{P}-12
P
−1与PP是否为素数。
import java.util.*;
import java.math.*;
import java.text.*;
import java.io.*;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
int num = in.nextInt();
System.out.println((int)(Math.log10(2)*num+1));
BigInteger sum = BigInteger.valueOf(1);
BigInteger ten = BigInteger.valueOf(10);
BigInteger number = BigInteger.valueOf(2);
ten = ten.pow(501);
number = number.pow(20);
for(int i=0; i<num/20; i++) {
sum = sum.multiply(number);
sum = sum.mod(ten);
}
if(num%20!=0)
sum = sum.multiply(BigInteger.valueOf((int)(Math.pow(2,(num-(num/20)*20)))));
sum = sum.subtract(BigInteger.valueOf(1));
String ss = String.valueOf(sum);
int count=0;
if(ss.length()>=500) {
for(int i=ss.length()-500; i<ss.length(); i++) {
out.print(ss.charAt(i));
count++;
if(count==50) {
count=0;
out.println();
}
out.flush();
}
} else {
count=0;
for(int i=0; i<500-ss.length(); i++) {
out.print('0');
count++;
if(count==50) {
count=0;
out.println();
}
out.flush();
}
for(int i=0; i<ss.length(); i++) {
out.print(ss.charAt(i));
count++;
if(count==50) {
count=0;
out.println();
}
out.flush();
}
}
}
}