1007 素数对猜想 (20分)
让我们定义dn
为:dn
=pn+1
−pn
,其中pi
是第i个素数。显然有d1
=1,且对于n>1有dn
是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105
),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
题目解析:
素数:2,3,5,7,11,13,17,19,23,……(不包括1)
测试点0-4输入都是介于2-31之间的数,最后一个测试点是比较大的一个数
我的方法就是,把N之内的所有素数找到,然后存放到数组中,然后在数组中寻找相邻的相差为2的素数的个数。
此题目的核心算法就是质数的判断:
质数:除了1和它本身,没有其它的数可以被其整除。所以判断是否质数的方法就是用这个数/2 /3 /4 …… 一直除到N-1,如果都没有整除的数那么这个数就是质数。但一般数较大的话判断起来比较耗时,所以一般判断到sqrt(N)就可以了。下面我给大家写一下素数的判断方法,需要牢牢掌握,会经常用到。
//判断N是不是质数的算法
/*后续还会有更厉害的判断素数的办法,大家目前可以先掌握这个,如果学
有余力的话还是建议大家看一下的,那个方法的优点就是判断速度更快,有效节约
判断时间,充分利用了质数只能是6x-1 或者 6x+1 的特点(除2、3外),明天我
发布这个算法,今天先消化这个 */
boolean flag=true;
for(int i=2;i<=Math.sqrt(N);i++){
if(N%i==0){
flag=false;
break;
}
}
if(flag){
System.out.prinln("N是质数");
}else{
System.out.println("不是");
}
AC代码:
import java.util.ArrayList;
import java.util.Scanner;
public class I007 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();//得到要判断的数
//list集合用来添加所有N以内的素数
ArrayList<Integer> list=new ArrayList<>();
//先将2、3添加进去
list.add(2);
list.add(3);
//2、3已经添加,直接从4开始判断
//判断质数的算法需要各位熟练掌握,以后会经常用到的
for(int i=4;i<=N;i++){
boolean flag=true;
for(int j=2;j<=Math.sqrt(i);j++){
//如果可以被整除,说明不是质数,令flag为false,退出循环
if(i%j==0){
flag=false;
break;
}
}
if(flag){//如果flag为true,说明i为质数,添加到list集合中
list.add(i);
}
}
//讲list集合中的元素改存到一个数组中
int pnums[]=new int[list.size()];
for(int i=0;i<pnums.length;i++){
pnums[i]=list.get(i);
}
//用来计数
int count=0;
//寻找相邻的相差为2的个数
for(int i=0;i<pnums.length-1;i++){
if(pnums[i+1]-pnums[i]==2){
count++;
}
}
//输出个数
System.out.print(count);
}
}
关注公众号”算法宝贝“获取更多题目解析