超级素数定义:算法
- m位超级素数自己是素数
- 最高位开始,去掉一位为m-1位的素数……
例: 103不是超级素数,去掉最高位的1以后为3,不是有个2位素数,137是一个三位超级素数,去掉最高位1以后为37,37是一个二位素数,去掉3以后为7,7也是一个素数数组
要求: 输入整数m(1 < m<=10),统计m位超级素数的个数,并输出其中最大的m位超级素数code
设置一个判断素数的方法blog
1位素数只有3个,3,5,7,咱们能够推测,2位超级素数的个位数只能是3,5,7,没有其余的选择了,同理,3位超级素数的十位和个位数只能是二位的超级素数组成,由此咱们就能够获得一个递推关系排序
Scanner scanner = new Scanner(System.in); int m = scanner.nextInt(); scanner.close(); int a[] = new int[10000]; int b[] = new int[10000]; int count =0;//统计超级素数的个数 int g = 3;//记录每个位的超级素数,当前记录的是个位的3个超级素数,3,5,7 以后每一位都会从新赋值 a[0] = 3; a[1] = 5; a[2]=7; //i表示十位,因此这里i要小于m for(int i=1;i<m;i++){ int t =0; int e = (int) Math.pow(10, i);//表示十位,百位…… 每个位的阶乘 //j*e 10,20…… 100,200…… for(int j=1;j<=9;j++){ //遍历a数组的所有素数 for(int k=0;k<g;k++){ if(panduan(e*j+a[k])){ b[t] = e * j +a[k]; t++;//统计在当前位的超级素数的个数,以后再赋值给g if(i==m-1){ count++;//统计 } } } } g=t; //将b数组中的数据转移动a数组中,便于以后的递推 for(int z=0;z<g;z++){ a[z] = b[z]; } } System.out.println(count); //冒泡排序,输出最大值 for(int i=0;i<a.length-1;i++){ for(int j=i+1;j<a.length;j++){ if(a[i]<a[j]){ int t = a[i]; a[i]=a[j]; a[j]=t; } } } System.out.println(a[0]); } /** * * @param a * @return 经过试商法判断a是否为素数 */ public static boolean panduan(int a){ int s = (int)Math.sqrt(a); for(int i=2;i<=s;i++){ if(a%i==0){ return false; } } return true; }