解题思路:
假设有一个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 人评分
点我有惊喜!你懂得!浏览:4112 |
矩形面积交 (Java代码)浏览:1281 |
C语言训练-计算1~N之间所有奇数之和 (C语言代码)浏览:689 |
C语言训练-排序问题<1> (C语言代码)浏览:636 |
数组输出 (C语言代码)错误???浏览:602 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:1482 |
1014题解浏览:524 |
1035 题解浏览:875 |
计算质因子 (C语言代码)浏览:778 |
简单的a+b (C语言代码)浏览:683 |