让我们定义 dn 为:dn = pn+1 − pn,其中 pi 是第 i 个素数。显然有 d1 = 1,且对于 n > 1 有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为 2 的素数”。
现给定任意正整数 N( < 105),请计算不超过 N 的满足猜想的素数对的个数。
输入格式
输入在一行给出正整数 N。
输出格式
在一行中输出不超过 N 的满足猜想的素数对的个数。
输入样例
20
输出样例
4
Java 代码
- 打表法 20分(满分)
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
boolean[] isPrimes = new boolean[n + 1];
int[] primes = new int[n];
int cnt = 0;
Arrays.fill(isPrimes, true);
for (int i = 2; i <= n; i++) {
if (isPrimes[i]) {
for (int k = 2; i * k <= n; k++) {
isPrimes[i * k] = false;
}
}
}
for (int i = 2; i <= n; i++) {
if (isPrimes[i]) {
primes[cnt++] = i;
}
}
int result = 0;
for (int i = 1; i < cnt; i++) {
if (primes[i] - primes[i - 1] == 2) {
result ++;
}
}
System.out.print(result);
}
}
- 定义 + 优化,18分(运行超时)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] primes = new int[n];
int cnt = 1;
primes[0] = 2;
int result = 0;
MAIN_LOOP:
for (int i = 3; i <= n; i++) {
for (int j = 0; j < cnt; j++) {
if (i % primes[j] == 0) {
continue MAIN_LOOP;
}
}
primes[cnt++] = i;
if (primes[cnt - 1] - primes[cnt - 2] == 2) {
result ++;
}
}
System.out.print(result);
}
}