分拆素数和
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 41385 Accepted Submission(s): 18160
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30 26 0
Sample Output
3 2
这道题其实是很简单的,前提是会素数筛选法,并且知道打表
关于素数筛选法的使用,我之前也是写过的,这里就不多讲了
有需要的可以到这里看看:
素数筛选法介绍
下面AC代码:
import java.util.Scanner;
public class Main{
private static final int MAX = 10000;
private static boolean[] primer;
private static Scanner scanner;
public static void main(String[] args) {
scanner = new Scanner(System.in);
ini();// 打表
while (scanner.hasNext()) {
int n = scanner.nextInt();
if (n == 0) {
break;
}
int count = 0;//计数器
for (int i = 2; i <= n / 2; i++) {
//是素数,而且是不同的素数!!
if (primer[i] && primer[n - i] && i != (n-i)) {
count++;
}
}
System.out.println(count);
}
}
// 判断素数(使用素数筛选法)
// 打表
private static void ini() {
primer = new boolean[MAX];
//先将所有元素标记为true
//除了primer[0]primer[1](默认是false)
for (int i = 2; i < MAX; i++) {
primer[i]= true;
}
for (int i = 2; i * i <= MAX; i++) {
if (primer[i]) {// 如果没被标记,就将他的倍数标记
for (int j = i + i; j < MAX; j += i) {
primer[j] = false;
}
}
}
}
}