蓝桥杯-超级质数

举报
别团等shy哥发育 发表于 2023/04/04 23:00:21 2023/04/04
【摘要】 @toc 1、问题描述如果一个质数 P 的每位数字都是质数, 而且每两个相邻的数字组成的两位 数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相邻的 k 位数字组成的 k 位数都是质数, 则 P 称为超级质数。如果把超级质数 P 看成一个字符串, 则这个超级质数的每个子串都是质 数。例如, 53 是一个超级质数。请问, 最大的超级质数是多少?答案提交这是一道结果填空的...

@toc

1、问题描述

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

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

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

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

答案提交

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

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

2、解题思路

这次用的方法感觉有点像暴力解法,我们直接将Integer类型转成String类型,然后对该字符串的每个字符进行遍历(只有质数才会进行遍历,否则直接跳过),这里需要遍历字符串的时候需要两层for循环,因为我们需要不断去截取字符串,并判断截取的字符串是否是质数,若每次截取下来的都是质数,则说明该数是超级质数,然后用一个临时变量保存下就行。

3、代码实现

先编写一个判断质数的函数

 public static boolean isPrime(int num){
        if (num==1)
            return false;
        for (int i = 2; i <=Math.sqrt(num); i++) {
            if(num%i==0)
                return false;
        }
        return true;
    }

主函数代码如下:

public static void main(String[] args) {
    int max=53;
    for (int i = max; i <Math.sqrt(Integer.MAX_VALUE); i++) {
        boolean flag=false;
        String s = String.valueOf(i);
        if(!isPrime(i)){    //不是质数的结束本次循环
            continue;
        }
        for (int j = 0; j < s.length(); j++) {
            for (int k =j; k < s.length(); k++) {
                if(k+1<=s.length()){
                    int temp=Integer.parseInt(s.substring(j,k+1));
                    if(isPrime(temp)){
                        flag=true;
                    }else{
                        flag=false; //只要有一个不满足条件,跳出最内层循环
                        break;
                    }
                }
            }
            if(!flag){    //跳出第二层循环
                break;
            }
        }
        if(flag){
            max=Math.max(max,i);
        }
    }
    System.out.println(max);
}

运行结果:

image.png

代码解释:

第一层for循环是我们需要遍历的数字,其实没有Integer.MAX_VALUE这么大,不超时就行。

然后设置一个标志位=false,如果当前数字不是质数,直接结束本次循环。

两次for循环是为了不断去截取不同长度并且相邻的字符串,然后去判断截取之后的数字是否为质数,若是设置flag=true,否则flag=false,用break跳出本次循环,跳出最内层的for循环之后,在判断flag是否为true,若是true,则需要将他的值和max比较,保留最大的超级质数,若flag=false,则继续跳出本层循环。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。