思路:
假设输入的是n,那么
1. 生成1到n之间的所有质数;(可知,是递增的序列)
2. 双向遍历数组(头尾同时开始),相等直接返回,否则:如果和大于n,那么right下标减一;和小于n,那么left下标加一;
代码java实现如下:
import java.util.ArrayList;
import java.util.Scanner;
public class MainZhiShu {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Integer[] canditates = MainZhiShu.ZhiShuHelper.generateZhiShu(n);
if(canditates.length == 0) {
System.out.println("NO");
}else {
int left = 0, right = canditates.length -1;
boolean result = canditates[right] == n ? true : false; //判断n是否就是质数
if(!result) { //n不是质数,故进入双向遍历判断
while(left <= right) {
if(canditates[left] + canditates[right] == n) {
result = true;
break;
}else if(canditates[left] + canditates[right] > n) {
right--;
}else {
left++;
}
}
}
if(result) {
System.out.println("YES:("+canditates[left]+","+canditates[right]+")");
}else {
System.out.println("NO");
}
}
}
static class ZhiShuHelper {
public static Integer[] generateZhiShu(int n) {
ArrayList<Integer> list = new ArrayList<Integer>();
boolean work = false;
for(int i = 2; i <= n; i++ ) {
work = true;
for(int j = 2, border = (int) Math.sqrt(i); j <= border; j++) {
if(i % j == 0) {
work = false;
break;
}
}
if(work) {
list.add(i);
}
}
Integer[] a = new Integer[list.size()];
System.out.println(list.toString());
return list.toArray(a);
}
}
}