原题链接:蓝桥杯算法提高VIP-特殊的质数肋骨
解题思路:
假设有一个n位的特殊质数,他可以看作为在n-1位的特殊质数基础上再在末尾加一位数,加上后判断其是否为质数即可,因为前面的已经是特殊质数了,只需要考虑加上最后一位数是否为质数,是质数就符合特殊质数的规则,而且因为只有在最后加上1、3、7、9这四个数才可能为质数,加上2、4、6、8均会被二整除,加上5定会被5整除,所以只需要判断加上1、3、7、9四个数后的数是否为质数即可,基于此很容易就可以想到用递归的方法进行解决,详解请参考代码注释。
注意事项:
无
参考代码:
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); ArrayList<Integer> result = new ArrayList<Integer>(); result = specialPrimeNumber(n); for (Integer integer : result) {//将集合遍历输出 System.out.println(integer); } scanner.close(); } public static ArrayList<Integer> specialPrimeNumber(int n) { ArrayList<Integer> num = new ArrayList<Integer>();//存储得到的特殊质数 if(n == 1) {//如果输入的是1,直接返回1-9的质数集合即可 for (int i = 0; i <= 9; i++) { if (isPrimeNumber(i)) { num.add(i); } } }else {//如果输入的大于1,就是在输入n-1时得到的特殊质数的基础上再加一位数 num = specialPrimeNumber(n-1);//得到输入n-1时求得的特殊质数集合 int size = num.size();//记录集合初始大小,因为在循环中集合的大小发生了改变 for (int i = 0; i < size; i++) { int temp = num.remove(0);//通过for循环依次取出特殊质数集合里的值 if (isPrimeNumber(temp *10 + 1)) {//在取出的特殊质数后加依次1、3、7、9,并判断其是否为质数 num.add(temp*10+1);//如果是质数就代表再加上这位数还是质数,符合特殊质数的条件,将其加入集合 } if (isPrimeNumber(temp *10 + 3)) { num.add(temp*10+3); } if (isPrimeNumber(temp *10 + 7)) { num.add(temp*10+7); } if (isPrimeNumber(temp *10 + 9)) { num.add(temp*10+9); } } } return num;//返回得到的特殊质数集合 } //判断是否是质数 public static boolean isPrimeNumber(int number) { int count = 0; for (int i = 2; i <= number; i++) { if (number % i == 0) { count ++; if (count > 1) { break; } } } if (count == 1) { return true; }else { return false; } } }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复