题目来源: HJ60 查找组成一个偶数最接近的两个素数
题目描述:
- 描述: 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
数据范围: 输入的数据满足 - 输入描述: 输入一个大于2的偶数
- 输出描述: 从小到大输出两个素数
示例1:
输入:20
输出:7
13
输入:4
输出:2
2
思路
素数(也说质数),数学上指在大于1的整数中只能被1和它本身整除的数。找一个数N之内,是否有素数,可以反其道行之,只需要反向找到是否有约数,没有约数就是素数(如果一个数字不是素数,那它除了1和他本身一定还有别的约数)
具体实现:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] ints = new int[N - 1]; //首先排除,1不是素数,其实没啥意义,用N也行,
//找一个数N之内,是否有素数,只需要反向找到是否有约数,没有约数就是素数
int sum = 0;
for (int i = 2, j = 0; i < N; i ++) {
if (!Prime_number(i)) { //判断是不是素数
ints[j] = i;
j++;
}
sum = j;
}
int[] ints2 = new int[N];
int k = 0;
for(int i = 0;i < sum;i++){
for(int j = i;j<sum;j++){
if(ints[i]+ints[j] == N){ //判断素数是否相加的和等于N
ints2[k++] = ints[i];
ints2[k++] = ints[j];
}
}
}
int temp = Integer.MAX_VALUE;
int[] arr = new int[2];
for(int i =0;i<k;i += 2){
if(Math.abs(ints2[i+1]-ints2[i]) < temp){ //将素数差值最小的素数筛选出来
arr[0] = ints2[i];
arr[1] = ints2[i+1];
temp = Math.abs(ints2[i+1]-ints2[i]);
}
}
System.out.println(arr[0]+"\n"+arr[1]);
}
static Boolean Prime_number(int number){ //用求约数的方法,反向判断是不是素数
for(int i = 2;i <= Math.sqrt(number); i ++){
if(number % i == 0){ //有约数,则不是素数
return true;
}
}
return false; //没有约数,则不是素数
}
}
思路杂记
1.上述思路是先将一个数N之内的所有素数求出来,对于这些素数进行筛选,筛选出满足相加后等于N的素数对,然后将每个素数对进行求差值,对于差值进行比较,将素数差值最小的筛选出来。
2.其实,对于上述思路,还有另外的实现方法,不用专门将素数求出来,而是直接将数N之内的数成对的进行判断,即将i与N-i进行判断,是否都是素数,这样就直接得到了既是素数又是满足相加为N的素数对,一举两得
import java.util.Scanner;
public class day15_2 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int min = Integer.MAX_VALUE;
int[] result = new int[2];
for (int i = 2, j = 0; i < N; i ++) {
//思路2的重要体现
if (Prime_number(i) && Prime_number(N - i)) { //直接判断出满足的素数对
if(Math.abs(N - i - i) < min){ //筛选出差值最小的素数对
result[0] = i;
result[1] = N - i;
min = Math.abs(N-i - i);
}
}
}
System.out.println(result[0]+"\n"+result[1]);
}
static Boolean Prime_number(int number){ //判断是否是素数
for(int i = 2;i <= Math.sqrt(number); i ++){
if(number % i == 0){
return false;
}
}
return true;
}
}