设计要点
根据超级素数的定义,m位超级素数去掉高位数字后是m-1位超级素数。一般地,k(k=2,3,......,m)位超级素数去掉高位数字后是k-1位超级素数。
那么,在已求得g个k-1位超级素数a[i](i=1,2,...,g)时在a[i]的高位加上一个数字j(j=1,2,...,9),得到9g个k位候选数f=j*e[k]+a[i](e[k]=10^(k-1)),只要对这9g个k位候选数检测。这就是从k-1递推到k的递推关系。
注意到超级m(m>1)位素数的个位数字必然是3或7,则得递推的初始(边界)条件:a[1]=3,a[2]=7,g=2;
package test; import java.util.*; public class test1 { public static void main(String[] args) { int i,g,j,k,m,t,s; long d = 0,f; double[] a=new double[20000]; double[] e=new double[20]; double[] b=new double[20000]; Scanner input=new Scanner(System.in); m=input.nextInt(); g=2;s=0; a[1]=3;a[2]=7;e[1]=1; for(k=2;k<=m;k++){ e[k]=e[k-1]*10; t=0; for(j=1;j<=9;j++) for(i=1;i<=g;i++){ f=(long)(j*e[k]+a[i]); if(p(f)==1){ t++;b[t]=f; if(k==m){ s++; d=f; System.out.println(); } } } g=t; for(i=1;i<=g;i++) a[i]=b[i]; } System.out.println("共"+s+"个"+m+"位超级素数"); System.out.println("其中最大数为"+d); } static int p(long k){//设计素数检测函数 int j,h,z; z=0; if(k==2)z=1; if(k>=3&&k%2==1){ for(h=0,j=3;j<=Math.sqrt(k);j+=2) if(k%j==0){ h=1; break; } if(h==0) z=1;//k为素数返回1,否则返回0 } return z; } }