递推-超级素数

设计要点

根据超级素数的定义,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;
    }
    
}
原文地址:https://www.cnblogs.com/ljs-666/p/8120076.html