算法學習——枚舉之全素組

算法說明

素數:只能被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;    
}

結果

相關文章
相關標籤/搜索