素数环_回溯法

课本例题:

素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。

#include <iostream>

#include <cmath>

using namespace std;
int Prime(int x)
{
    int n = (int)sqrt(x);
    for (int i = 2; i <= n; i++)
    {
        if (x % i == 0)
            return 0;
    }
    return 1;
}
int Check(int k, int n, int a[])
{
    for (int i = 0; i < k; i++)
        if (a[i] == a[k])
            return 0;
    int f = 0;
    f = Prime(a[k] + a[k - 1]);
    if (f == 1 && k == n - 1)
        f = Prime(a[k] + a[0]);
    return f;
}

void PrimeCircle(int n)
{
    int a[n] = {0};
    a[0] = 1;
    int k = 1;
    while (k >= 1)
    {
        a[k]++;
        while (a[k] <= n)
            if (Check(k, n, a))
                break;
            else
                a[k]++;
        if (a[k] <= n && k == n - 1)
        {
            for (auto i : a)
                cout << i << " ";
            // cout << endl;
            // k--; // 这里要减一,因为k++在下一轮循环中执行
            return; // 这里只需要一个结果,如果需要全部结果,则需要注释掉return并解注释上方两句
        }
        if (a[k] <= n && k < n - 1)
        {
            k++;
        }
        else
        {
            a[k] = 0;
            k--;
        }
    }
}
int main()
{
    int n = 10;

    PrimeCircle(n);

    system("pause");
    return 0;
}

 

posted @ 2024-05-28 21:52  CV小能手chh  阅读(8)  评论(0)    收藏  举报  来源