天天看点

素数环问题的非递归实现

     关于素数环问题,我在早先的一个帖子里已经做了详细的说明。那时候我用的是递归的方式来实现的。今天我又使用非递归的方式把这个问题做了一遍,有兴趣的网友可以一起探讨!

素数环问题的非递归实现

package andycpp;

素数环问题的非递归实现
素数环问题的非递归实现
素数环问题的非递归实现

public class Main ...{

素数环问题的非递归实现
素数环问题的非递归实现
素数环问题的非递归实现

    public static void main(String[] args) ...{

素数环问题的非递归实现

        primering(20);

素数环问题的非递归实现

    }

素数环问题的非递归实现
素数环问题的非递归实现
素数环问题的非递归实现

    public static void primering(int n) ...{

素数环问题的非递归实现
素数环问题的非递归实现

        if(n % 2 != 0) ...{

素数环问题的非递归实现

            System.out.println("若要实现素数环,元素的个数必须为偶数,您的输入不符合要求!");

素数环问题的非递归实现

            return;

素数环问题的非递归实现

        }

素数环问题的非递归实现
素数环问题的非递归实现

        int[] a = new int[n];

素数环问题的非递归实现

        a[0] = 1;

素数环问题的非递归实现

        int i = 1;

素数环问题的非递归实现

        boolean flag = true; // true表示正常向下一级移动,false表示回溯到上一级

素数环问题的非递归实现

        int first;

素数环问题的非递归实现
素数环问题的非递归实现

        while (i < n) ...{

素数环问题的非递归实现

            //选择一个元素

素数环问题的非递归实现

            //如果是正常向下一级移动,该元素应该是当前未使用的最小的数

素数环问题的非递归实现

            //若是从下一层回溯上来的,则该元素为“比当前值大的,并且未被使用的,最小的一个数”

素数环问题的非递归实现
素数环问题的非递归实现

            for1: for (a[i] = flag ? 2 : a[i] + 1; a[i] <= n; a[i]++) ...{

素数环问题的非递归实现
素数环问题的非递归实现

                for (int j = 0; j < i; j++) ...{//检验选择的元素是否曾经用过

素数环问题的非递归实现

                    if (a[i] == a[j])

素数环问题的非递归实现

                        continue for1;

素数环问题的非递归实现

                }

素数环问题的非递归实现

                break;

素数环问题的非递归实现

            }

素数环问题的非递归实现
素数环问题的非递归实现

        //若选择的元素超过了最大值,则应该回溯

素数环问题的非递归实现
素数环问题的非递归实现

            if (a[i] > n) ...{

素数环问题的非递归实现

                i--;

素数环问题的非递归实现

                flag = false;

素数环问题的非递归实现

                continue;

素数环问题的非递归实现

            }

素数环问题的非递归实现
素数环问题的非递归实现

            // 如果当前找到的元素与前一个元素的和是素数

素数环问题的非递归实现
素数环问题的非递归实现

            if (isPrime(a[i] + a[i - 1])) ...{

素数环问题的非递归实现
素数环问题的非递归实现

                if (i < n - 1) ...{ // 如果不是最后一个元素,则向下一级寻找

素数环问题的非递归实现

                    i++;

素数环问题的非递归实现

                    flag = true;

素数环问题的非递归实现
素数环问题的非递归实现

                } else if (isPrime(a[i] + a[0])) ...{ // 如果是最后一个元素并且于环的第一个元素的和仍然是素数

素数环问题的非递归实现

                    break;        //则素数环已经找到,退出循环

素数环问题的非递归实现
素数环问题的非递归实现

                } else ...{    //若是最后一个元素,并且不满足素数环

素数环问题的非递归实现

                    i--;    //则向上一级回溯

素数环问题的非递归实现

                    flag = false;

素数环问题的非递归实现

                }

素数环问题的非递归实现
素数环问题的非递归实现

            } else ...{    //若当前元素不满足素数环,则继续寻找

素数环问题的非递归实现

                flag = false;

素数环问题的非递归实现

            }

素数环问题的非递归实现

        }

素数环问题的非递归实现
素数环问题的非递归实现

        //打印素数环

素数环问题的非递归实现
素数环问题的非递归实现

        for(int x:a) ...{

素数环问题的非递归实现

            System.out.print(x+"  ");

素数环问题的非递归实现

        }

素数环问题的非递归实现

    }

素数环问题的非递归实现
素数环问题的非递归实现
素数环问题的非递归实现

    public static boolean isPrime(int n) ...{

素数环问题的非递归实现

        int i;

素数环问题的非递归实现

        for (i = 2; i < n; i++)

素数环问题的非递归实现

            if (n % i == 0)

素数环问题的非递归实现

                break;

素数环问题的非递归实现

        return i==n;

素数环问题的非递归实现

    }

素数环问题的非递归实现

}

素数环问题的非递归实现