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; } } } } }