素數和

1 題目描述

  NowCoder發現某些整數能夠拆分紅兩個不一樣的素數的和。例如7=2+五、20=3+17=7+13等。
  他想知道每一個正整數都有幾種拆分的方法,你能幫他解決嗎?java

1.1 輸入描述:

  輸入包括多組數據。
  每組數據僅有一個整數n (1≤n≤100000)。算法

1.2 輸出描述:

  對應每一個整數,輸出其拆成不一樣素數和的個數,每一個結果佔一行。測試

1.3 輸入例子:

30
26
20

 

1.4 輸出例子:

3
2
2

 

2 解題思路

  使用暴力計算法進行實現spa

3 算法實現

import java.util.Scanner;

/**
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    private final static int NUM = 100_000 + 1;
    private final static int[] ANS = new int[NUM];

    public static void main(String[] args) {

        init();
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            System.out.println(ANS[n]);
        }

        scanner.close();
    }

    private static void init() {

        // 標記是不是素數
        // false表示是素數
        // true表示不是素數
        // 下標爲0和1的不使用
        boolean[] mark = new boolean[NUM];


        // 取出[1, NUM]中的全部素數
        int[] primes = new int[NUM];
        // 記錄素數個數
        int count = 0;
        for (int i = 2; i < NUM; i++) {
            // i是質數
            if (!mark[i]) {
                // 記錄素數
                primes[count] = i;
                count++;

                // 標記不是素數的
                for (int j = 2 * i; j < NUM; j += i) {
                    mark[j] = true;
                }
            }
        }

        // 求[0, NUM]中,每一個數字能夠用幾組素數表示
        int v;
        for (int i = 0; i < count; i++) {
            for (int j = i + 1; j < count; j++) {
                v = primes[i] + primes[j];
                if (v < NUM) {
                    ANS[v]++;
                }
                // 已經大於NUM說明後面的數還會大於NUM,因此要退出內層循環
                else {
                    break;
                }
            }
        }
    }
}

 

4 測試結果

這裏寫圖片描述

相關文章