1007. 素数对猜想 (20)
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:20输出样例:
4
这道题核心问题就是怎么判断一个数是素数,我使用的方法对于一个数num,如果2到根号num都不能整除num,则这个数就是素数。如果用2到num/2去判断效率没有用根号的高。
下面是程序的代码,在C++的程序中写了详细的注释,Java的和C++几乎一样,只是java中开根号需要调用Math,然后调用判断是否为素数这个方法的时候需要设置为静态方法才能直接通过方法名进行调用。
C++代码:
#include <iostream>
#include<cmath>
using namespace std;
//判断是否为素数
bool isPrimeNum(int num) {
//如果能被2到根号num中的某个值整除,则这个数不是素数
for(int i=2; i<=sqrt((double)num); i++) {
if(num%i==0) {
return false;
}
}
return true;
}
int main() {
int n;
int count =0;
cin>>n;
//如果输入的数小于5,则没有满足猜想的素数对
if(n<5) {
count=0;
} else {
//因为1不是素数,与2差为2的4也不是素数,所以循环从3开始
for(int i=3; i<=n-2; i++) {
//判断差为2的两个数是否都为素数
if(isPrimeNum(i)&&isPrimeNum(i+2)) {
count++;
}
}
}
cout<<count<<endl;
return 0;
}
Java代码:
import java.util.Scanner;
public class Main {
static boolean isPrimeNum(int num) {
double temp = Math.sqrt(num);
for (int i = 2; i <= temp; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
int count = 0;
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
if (n < 5) {
count = 0;
} else {
for (int i = 3; i <= n - 2; i++) {
if (isPrimeNum(i) && isPrimeNum(i + 2)) {
count++;
}
}
}
System.out.println(count);
scanner.close();
}
}