Java 算法 麦森数

题目描述

形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
  任务:从文件中输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)

输入
输入描述:
  文件中只包含一个整数P(1000<P<3100000)
输入样例:
1279

输出

输出描述:
  第一行:十进制高精度数2P-1的位数。
  第2-11行:十进制高精度数2P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
  不必验证2P-1与P是否为素数。
输出样例:
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087

HINT:时间限制:1.0s 内存限制:256.0MB

解题思路

因为数字太大 所以选用BigInteger来存储数据,可以用m*Math.log10(2)+1方法来计算2的m次方。剩下的就是输出的问题了。可以通过BigInteger的pow方法来设置位数,若大于的话就可以直接输出,小于的话就需要先补上少于500的位数,之后再输出。

代码

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    

    public static void main(String[] args) {
    
    
        Scanner scanner=new Scanner(System.in);
        int m=scanner.nextInt();
        BigInteger n1=new BigInteger("10");
        n1=n1.pow(501);//设置位数
        BigInteger n2=new BigInteger("1");
        BigInteger n=new BigInteger("2");
        n=n.modPow(BigInteger.valueOf(m),n1);//计算值
        n=n.subtract(n2);//减去1
        String n4=n.toString();//转换为字符串
        System.out.println((int)(m*Math.log10(2)+1));//输出位数
        if (n4.length()>500){
    
    //大于500时
            n4=n4.substring(n4.length()-500);//控制位数
            for (int j=0;j<10;j++){
    
    
                System.out.println(n4.substring(j*50,j*50+50));//输出
            }
        } else{
    
    
            for (int j=0,b=1;j<500-n4.length();j++){
    
    //小于500时
                System.out.print("0");//先输出补位0的数目
                if (b%50==0){
    
    
                    System.out.println();
                }
                b++;
            }
            int p=(500-n4.length())%50;//计算还差多少到达50字符
            for (int k=0,a=p;k<n4.length();k++){
    
    
                System.out.print(n4.charAt(k));//输出
                if (k==49-p){
    
    
                    System.out.println();//达到50位时换行
                    a=0;//令a为0 重新计算
                }
                if (a!=0 && a%50==0){
    
    
                    System.out.println();//每50字符换行
                }
                a++;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/joreng/article/details/121889793