算法学习——枚举之全素组

算法说明

素数:只能被1与自己整除的整数。算法

1和0不是素数,也不是合数数组

不大于指定整数n的3个素数之和也是素数,则说这三个素数时基于整数n的全素组code

例如:n=15,素数3,5,11之和3+5+11=29也为素数,因此称3,5,11是一个基于15的全数组blog

输入一个整数n(n不大于3000),输出基于n的全素组的个数,并输出最大全素组变量

算法思路

  1. 先取得0~n的素数,存入数组之中
  2. 而后使用三重枚举循环,从数组之中每次取三个,判断三个数之和是否为素数
  3. 考虑到全素组数目较多,设置一个long长整型变量记录全素组的个数,同时,设置一个max记录全素组的最大值,三个变量用于接收最大全素组的三个数

算法实现

Scanner scaner = new Scanner(System.in);
    int a = scaner.nextInt();
    scaner.close();
    int[] b =  new int[1500];
    long count =0;//全素组个数
    int countsushu=0;//0~n的素数个数
    //找出0到a的素数,存放在b数组中
    for(int i=2,j=0;i<=a;i++){
        if(panduan(i)){
            b[j] = i;
            countsushu++;
            j++;
        }
    }
    int max=0;
    int c1=0,c2=0,c3=0;
    for(int i=1;i<=countsushu-2;i++){
        for(int j=i+1;j<=countsushu-1;j++){
            for(int k=j+1;k<=countsushu;k++){
                if(panduan(b[i]+b[j]+b[k])){
                    count= count+1;
                    if(b[i]+b[j]+b[k]>max){
                        c1=b[i];
                        c2=b[j];
                        c3=b[k];
                        max = b[i]+b[j]+b[k];
                    }
                    
                }
            }
        }
    }
    System.out.println("共有" + count+"个全素组");
    System.out.println("一个最大全素组为:"+c1+"+"+c2+"+"+c3+"="+max);
}
/**
 * 
 * @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;    
}

结果

相关文章
相关标签/搜索