让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
1 package com.hone.basical; 2 import java.util.Scanner; 3 4 5 /** 6 * 原题目:https://www.patest.cn/contests/pat-b-practise/1007 7 * @author Xia 8 * 第一次做的时候是按照判断每一个数是否是素数,然后添加到list中(容易理解,但是超时) 9 * 现在一直判断数据对是否是素数,先判断a是否是素数,再判断a+2是否是素数。 10 */ 11 public class basicalLevel1007PrimeNumGuess { 12 13 public static void main(String[] args) { 14 //m用于记录素数对 15 int m =1; 16 Scanner input = new Scanner(System.in); 17 int n = input.nextInt(); 18 if(n < 3){ 19 System.out.println(0); 20 } 21 else if (n == 3) { 22 System.out.println(1); 23 }else{ 24 for (int i = 5; (i+2) <= n; ) { //下面从四种情况来讨论 25 if (isPrime(i)) { 26 if (isPrime(i+2)) 27 m++; 28 i = i+4; 29 }else { 30 if (isPrime(i+2)) 31 i = i+2; 32 else 33 i = i+4; 34 } 35 } 36 System.out.println(m); 37 } 38 } 39 40 //判断是否是素数 41 public static boolean isPrime(int a){ 42 boolean flag = true; 43 for (int i = 2; i <= Math.sqrt(a); i++) { 44 if (a%i == 0) { 45 flag = false; 46 break; 47 } 48 } 49 return flag; 50 } 51 }