黄志颖


私信TA

用户名:2258070040

访问量:1826

签 名:

等  级
排  名 5000
经  验 1607
参赛次数 0
文章发表 10
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
        假设有一个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 人评分

  评论区

妙啊
2022-03-02 20:10:23
  • «
  • 1
  • »