NowCoder發現某些整數能夠拆分紅兩個不一樣的素數的和。例如7=2+五、20=3+17=7+13等。
他想知道每一個正整數都有幾種拆分的方法,你能幫他解決嗎?java
輸入包括多組數據。
每組數據僅有一個整數n (1≤n≤100000)。算法
對應每一個整數,輸出其拆成不一樣素數和的個數,每一個結果佔一行。測試
30 26 20
3 2 2
使用暴力計算法進行實現spa
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; } } } } }