dxxbjl 发表于 2023-3-25 20:36

超级素数

> **如果一个质数 P 的每位数字都是质数, 而且每两个相邻的数字组成的两位数是质数, 而且每三位相邻的数字组成的三位数是质数, 依次类推, 如果每相邻的 k 位数字组成的 k 位数都是质数, 则 P 称为超级质数。如果把超级质数 P 看成一个字符串, 则这个超级质数的每个子串都是质数。请问, 最大的超级质数是多少?**

思路:
先判断这个数是不是素数,然后判断这个数的所有子串是不是素数。
如何判断所有子串是不是素数?
--双重for循环,截取数字

```
public static void main(String[] args) {
                // TODO Auto-generated method stub
                List<Integer>list =new ArrayList<Integer>();
               
                //可以倒着写 i--,直接打印第一个数就是最大的
                //但是又不知道最大的数是多少,还是正着来吧
                for (int i = 1; i<1000000; i++) {
                        if(isAllPrime(i)) {
                        //把所有满足要求的素数都打印出来了
                                list.add(i);
                        }
                }
                //取最大的素数
                System.out.println(Collections.max(list));
       
        }
           //判断相邻的n位是不是质数
    public static boolean isAllPrime(int num){
      
      String str = num+"";
      for(int i=0;i<str.length();i++){
           for (int j = i; j <str.length(); j++) {
                       //将字符串转为整数
                       //substring 左闭右开,j要比i大
                        int res = Integer.parseInt(str.substring(i,j+1)) ;
                        if(!isPrime(res)) {
                                return false;
                        }
                }
      }
      return true;
    }

//判断是不是质数
    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;
    }
```

列明 发表于 2023-3-25 22:26

要解决这个问题,需要一个小学生用一台计算机算好多天,但是要优化这个问题的解决方案,那就需要一堆数论学家和全世界的超算算好几辈子。

yamisxu 发表于 2023-3-26 00:33

算出来也没啥,浪费能量

ai364395368 发表于 2023-3-26 09:03

经过计算,最大的超级质数是73939133。

iawyxkdn8 发表于 2023-3-26 09:07

本帖最后由 iawyxkdn8 于 2023-3-26 09:11 编辑

import java.util.*;

public class LargestPrime {
    public static void main(String[] args) {
      List<Integer> list = new ArrayList<Integer>();
      int maxNum = 1000000;
      int minNum = 100000;
      // 在所有长度为6的数中寻找素数
      for (int i = minNum; i < maxNum; i++) {
            if (isAllPrime(i)) {
                list.add(i);
            }
      }
      System.out.println(Collections.max(list));
    }

    public static boolean isAllPrime(int num) {
      String str = Integer.toString(num);
      for (int i = 0; i < str.length(); i++) {
            for (int j = i; j < str.length(); j++) {
                int res = Integer.parseInt(str.substring(i, j + 1));
                if (!isPrime(res)) {
                  return false;
                }
            }
      }
      return true;
    }

    private static Map<Integer, Boolean> cache = new HashMap<Integer, Boolean>();

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

cn2jp 发表于 2023-3-26 09:08

yamisxu 发表于 2023-3-26 00:33
算出来也没啥,浪费能量

体现一种思维模式吧

zzzznl 发表于 2023-3-26 10:38

这是道很奇怪的题目,当然也不排除我没看懂题目的可能。
首先超级质数定义不同,不过按题中描述,叫超级超级质数什么也只是个名字
每位都是质数,在我的理解中,单位的质数只有2357,其中2和5只能放首位,否则两位数就不是质数了
其次相邻两位不能相同,否则除以11能除尽
再次25放首位不能有7,否则除3能除尽
所以2或5首位最大的超级质数是53
放弃25,则成了37的排列组合
373是质数,而737不是质数(7+7-3)=11
因此最大的题目要求的超级质数是373
这种做法厉害的小学生怕是10分钟能做出来,甚至不一定用编程验证,建议优化一下题目

skywalker0123 发表于 2023-3-26 10:39

最大373吧

sihua3000 发表于 2023-3-26 13:43

不在于结果,在于解决思路,结果只是对于思路的验证

1107934496 发表于 2023-4-13 14:24

ai364395368 发表于 2023-3-26 09:03
经过计算,最大的超级质数是73939133。

错误的,9,39,93,……等数都不是质数
页: [1]
查看完整版本: 超级素数