检查数字是否是两个素数的总和

时间:2018-02-03 04:57:15

标签: java arrays primes

问题是检查随机数n可以是2个随机素数的总和。例如,

  

如果n = 34,则可能是(3 + 31),(5 + 29),(17 + 17)......

到目前为止,我已设法将素数保存到数组中,但不知道如何检查,如果n是2个素数的总和。

这是我的代码的一部分:

public static void primeNumbers(int n) {
    int i = 0, candidate = 2, countArray = 0, countPrime = 0;
    boolean flag = true;

    while (candidate <= n) {
        flag = true;
        for (i = 2; i < candidate; i++) {
            if ((candidate % i) == 0) {
                flag = false;
                break;
            }
        }
        if (flag) {
            countPrime++;
        }
        candidate++;
    }
    int[] primeNumbers = new int[countPrime];


    while (candidate <= n) {
        flag = true;
        for (i = 2; i < candidate; i++) {
            if ((candidate % i) == 0) {
                flag = false;
                break;
            }
        }
        if (flag) {
            primeNumbers[countArray] = candidate;
        }
        candidate++;
        countArray++;
    }

    for (i = 0; i <= primeNumbers.length; i++) {

    }
}

首先我计算了1-n之间有多少素数,所以我可以为素数声明和初始化我的数组。然后我将素数保存到数组中。但现在我不知道如何检查n是否是2个素数的总和。

2 个答案:

答案 0 :(得分:2)

鉴于您已经有“质数低于给定数量”的列表,检查两个素数是否可以求和给定数字是一项非常容易的任务。

for(int i=0; i<array.length; i++){

    int firstNum = array[i];
    int secondNum = givenNum - firstNum;

    /* Now if it is possible to sum up two prime nums to result into given num, secondNum should also be prime and be inside array */

    if(ArrayUtils.contains(array, secondNum)){
        System.out.println("Yes, it is possible. Numbers are "+ firstNum + " and " + secondNum);
    }
}

编辑:ArrayUtils是Apache Commons Lang库的一部分 但是,您可以使用ArrayList代替使用包含方法。

答案 1 :(得分:1)

您不必检查从1到给定数字的所有素数,甚至不需要数组。

算法可以是;

  

首先编写一个检查给定数字是否为质数的函数。   将数字分为两部分,0和剩余值(数字本身)。现在开始将数字部分减1,并同时开始将1加0。当我们要减少的数字部分变为0或两个部分均为质数时,停止。

另一种算法可以是这样的(类似于公认的答案)

  

从2开始从给定的数字中减去质数。检查减法是否也是质数。   当您将减法运算作为质数时,stop,您得到了两个合计为给定数的质数。