这道题其实就是找出孪生素数对呗,直接上
题目
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数
N
(<105),请计算不超过N
的满足猜想的素数对的个数。输入格式:
输入在一行给出正整数
N
。输出格式:
在一行中输出不超过
N
的满足猜想的素数对的个数。输入样例:
20
输出样例:
4
科普一下
这里解释一下素数和孪生素数对吧。
素数的概念:
素数是一个大于1的自然数,只有1和它本身两个因数。换句话说,素数不能被比它小的其他自然数整除。例如,6不是素数,因为它可以被2和3整除;但7是素数,因为没有其他的数(除了1和7本身)能整除7。
10以内的素数:
10以内的素数有2、3、5和7。这些数都只能被1和它们本身整除。
孪生素数:
孪生素数是指一对素数,它们之间的差恰好是2。例如,(3, 5)就是一对孪生素数,因为它们都是素数,且它们的差是2。在10以内,存在两对孪生素数,分别是(3, 5)和(5, 7)。
解题思路
1、计算小于N的所有素数。遍历从2到N的数字,其中素数指的是只能被1和它本身整除的数。
2、然后循环遍历N的素数集合,计算每个素数加2后的数是否存在于素数集合中。如果存在,则表示这是一对孪生素数对。
3、记录所有出现的孪生素数对的次数,并返回总对数。
代码
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
int twinPrimeCount = 0;
// 遍历2到N的所有数,检查它们是否为孪生素数
for (int i = 2; i <= number - 2; i++) {
//如果素数i 和 i+2后的数也是素数那么他俩就是一对孪生素数
if (isPrime(i) && isPrime(i + 2)) {
twinPrimeCount++;
}
}
System.out.println(twinPrimeCount);
sc.close();
}
// 检查一个数是否是素数
private static boolean isPrime(int num) {
//素数必须大于1
if (num <= 1) {
return false;
}
for (int i = 2; i * i <= num; i++) {
//如果 num 能被任何小于或等于它的平方根的整数 i 整除,那么 num 就不是素数
if (num % i == 0) {
return false;
}
}
return true;
}
}