你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
标题:组素数
素数就是不能再进行等分的数,比如:2、3、5、7、11等
9=3*3 说明它可以3等分,因而不是素数
我们国家在1949年建国,如果只给你1、9、4、9这4个数字卡片,可以随意摆放它们的先后顺序,(但卡片不能倒着摆放啊,我们不是在做脑筋急转弯)
那么你能组成多少个4位的素数呢?
比如1949、4919都符合要求
请你提交能组成的4位素数的个数,不要罗列这些素数!!
注意:不要提交解答过程,或其他的辅助说明文字
考察重点:
递归和回溯算法下对元素的全排列、素数的判断、重复元素的去重
在这道题中我们需要重点掌握的就是递归和回溯算法下对元素的全排列,根据该思想对1、9、4、9这四个数进行全排列,获取到排列结果,然后对排列结果进行判断,判断其是不是素数,之后记录符合要求的素数的个数即可。
答案源码:
package 一三年省赛真题; import java.util.HashSet; import java.util.Set; public class Year2013_t2 { static Set<Integer> set = new HashSet<Integer>(); //定义hash集合,存放符合要求的数值 /** * 数组元素的全排列 * @param arr 数据数组 * @param n 从第几个元素开始排列 * */ public static void arrange(int[] arr,int n) { //如果排列的数值的序号等于数组的长度,说明最后一个元素已经确定 if (n==arr.length) { int num = arr[0]*1000 + arr[1]*100 + arr[2]*10 + arr[3]; //如果是素数 if (check(num)==num) { set.add(num); //将数值添加到集合中,并去重 } } for (int i = n; i < arr.length; i++) { //数值交换 int t = arr[n]; arr[n] = arr[i]; arr[i] = t; arrange(arr, n+1); //确定下一个数值 t = arr[n]; arr[n] = arr[i]; arr[i] = t; } } /** * 判断一个数是不是素数 * @return 是素数就返回该数,不是就返回0 */ private static int check(int num) { for (int i = 2; i <= Math.sqrt(num); i++) { if (num % i == 0) { return 0; } } return num; } public static void main(String[] args) { int[] array = {1,9,4,9}; arrange(array, 0); System.out.println(set.size()); //输出存放在集合中的符合要求的数据长度 } }
输出样例:
其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!
感兴趣的小伙伴可以关注专栏!
灰小猿陪你一起进步!