题意:
判断一个数即以下的数是否为素数(质数),如果是,则该数和其相邻的素数(质数)的差值是否为2,为2则记录一对
例如:20===>19,17,13,11,7,5,3,2,1(当然我们可以在做的时候将2,1直接排除!)
你看 ===>(19-17)=(13-11)=(7-5)=(5-3)==2 (一共有4对符合故,输入20则输出4)
同理40===>37,31,29,23,19,17,13,11,7,5,3,2,1符合的有(31,29),(19,17),(13,11),(7,5),(5,3) (一共有5对符合故,输入40则输出5)
一下为解题思想:
1.获取输入样例及一下的所以素数(质数)
2.判断相邻的素数(质数)之差是否为2
代码:
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();//获取输入样例
ArrayList<Integer> list = new ArrayList<Integer>();//存素数(质数)的数组
int count = 0;//记录有多少对
for (int a = number; a >= 2; a--) {//判断并添加素数(质数)
if (IsPrime(a))
list.add(a);
}
for (int a = 0; a < list.size()-1; a++) {//判断差值是否为2,如果是就记录加1
if (list.get(a) - list.get(a+1) == 2 ){
count++;
}
}
System.out.print(count+"\n");
}
public static boolean IsPrime(int x){//该函数等下有讲解!
for (int a = 2;a<=(int)Math.sqrt(x);a++) {
if (x%a==0)
return false;
}
return true;
}
}
IsPrime()讲解:
1.在判断一个数是否为素数时,很多人都会使用从 2 到这个数本身的所有整数来逐一检查,判断是否能整除。但是这样的方法会造成大量不必要的计算。
2.取平方根是因为,每个数都可以表示为两个因子的乘积,其中一个因子小于或等于它的平方根,另一个因子大于或等于它的平方根。如果两个因子都大于它的平方根,则它们的乘积一定大于这个数,因此不可能是它的因子。
3.以 25 为例,它的平方根为 5,因此我们只需要检查 2,3,4 和 5 是否是它的因子,就可以确定它不是素数(质数)。如果我们继续检查 6,7,8……会浪费manymany时间。