蓝桥杯:超级质数

文章介绍了一种被称为超级质数的概念,即每个位数都是质数且所有子串都是质数的数字。它提供了一个Java代码示例,用于模拟寻找最大的超级质数的过程,代码通过检查每个数字及它的所有子串是否为质数来实现。最后,文章提到了程序运行的时间复杂度。
摘要由CSDN通过智能技术生成

目录

题目链接

问题描述

答案提交

本题答案为:373。

思路:

模拟代码(Java):


问题描述

如果一个质数 P 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相 邻的 k 位数字组成的 k 位数都是质数, 则 P 称为超级质数。

如果把超级质数 P 看成一个字符串, 则这个超级质数的每个子串都是质数。

例如, 53 是一个超级质数。

请问, 最大的超级质数是多少?

答案提交

这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。

本题答案为:373。

思路:

        首先P的每位数字要是质数。然后看相邻k位数字组成的k位数都是质数,也就是将该数字看作字符串,他的其中一个子串要是质数,跟下面的条件冲突,所以这里不额外分析。

        其次就是把这个数字看成字符串,该字符串的每个子串都要是质数。

        其实很简单的模拟,就两点要求:

  1. 该数字必须是质数,并且每一位都是质数
  2. 该数字的所有子串都必须是质数

        看完要求,我们再分析。

        条件一就是,该数字是质数,很简单,我们写一个for来判断就可以了,质数的定义就是除了1和2之外没有一个小于他的数整除。

        //在判断number是否为质数
        for(int i = 2;i<Math.sqrt(number);i++){
            if(number % i == 0) return false;
         }

        其次,这个数字的每一位都是质数,也就是我们需要对他的每一位进行判断。因为10以内的质数只有2,3,5,7,所以我们只需要判断每一位是否为2,3,5,7即可。

        我这里用了一个boolean数组判断位数,hash[2] == hash[3] == hash[5] == hash[7] == true,其余为false。大家也可以直接判断这个数是不是2,3,5,7就行了。

        //先判断每一位是否为质数
        int x = number;
        while( x > 0) {
            if(hash[x%10]==false) return false;
            x /= 10;
        }

        条件二就是,判断该数字的所有子串是否为质数,我们只需要把这个数字的所有子串求出来,可以选择set去重,然后在遍历子串的时候转换成整型,调用我们写的条件一的方法来判断这个数字是否为质数就行了。

        //子串存放在set中
        Set<String> set = new HashSet<>();
        int n = number.length();
        for(int i = 0;i<n;i++) {
            for(int j = i+1;j<=n;j++){ //因为substring是左闭右开,也就是包括i,不包括j,所以j可以<=n
                set.add(number.substring(i,j));
            }
        }

模拟代码(Java):

        因为是填空题,只需要提交答案,我们可以自己模拟,我模拟的时候,超级质数的上限选择了整型的上限。我用自己的电脑跑大约耗时5s。

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    static boolean[] hash;
    public static void main(String[] args) {
        //十以内的质数是2,3,5,7
        //直接初始化一个数组用来判断i是否每一位都是质数
        hash= new boolean[10];
        Arrays.fill(hash,false);
        hash[2] = true;
        hash[3] = true;
        hash[5] = true;
        hash[7] = true;
        long startTime=System.currentTimeMillis(); //获取开始时间
        //循环找最大的超级质数
        for(int i = 53;i<Integer.MAX_VALUE;i++){
            if(check(i) && check(i+"") ) {
                System.out.println("超级质数:"+i);
            }
        }
        long endTime=System.currentTimeMillis(); //获取结束时间
        System.out.println("程序运行时间: "+(endTime-startTime)/1000+"s");
    }
    //条件1:每一位都是质数并且本身也是质数
    public static boolean check(int number){
        //先判断每一位是否为质数
        int x = number;
        while( x > 0) {
            if(hash[x%10]==false) return false;
            x /= 10;
        }
        //在判断number是否为质数
        for(int i = 2;i<Math.sqrt(number);i++){
            if(number % i == 0) return false;
        }
        return true;
    }
    //条件2:该数的所有子串都是质数
    public static boolean check(String number) {
        //子串存放在set中
        Set<String> set = new HashSet<>();
        int n = number.length();
        for(int i = 0;i<n;i++) {
            for(int j = i+1;j<=n;j++){ //因为substring是左闭右开,也就是包括i,不包括j,所以j可以<=n
                set.add(number.substring(i,j));
            }
        }
        //判断其所有子串是否为质数
        for(String str : set) {
            int num = Integer.parseInt(str);
            //只有一个不是质数都不满足条件
            if( check(num) == false) return false;
        }
        return true;
    }
}

运行结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值