您的位置:首页 > 编程语言 > Java开发

判断一个正整数能否表示为两个质数之和

2017-03-26 12:20 337 查看
思路:

假设输入的是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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐