素数环问题

来源:互联网 发布:ucosiii软件定时器 编辑:程序博客网 时间:2024/05/02 04:29

把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
C++代码:

#include <iostream>#include <vector>#include <cmath>using namespace std;//打印结果void printSolution(const vector<int> &v){    for (vector<int>::const_iterator it = v.begin();it != v.end();++it)    {        cout<<*it<<' ';    }    cout<<endl;}//检查数字j是否和前面以放的数字重复bool check1(const vector<int> &v, int i, int j){    for (int k=0;k<i;++k)    {        if (j == v[k])        {            return false;        }    }    return true;}//检查数n是否是素数bool check2(int n){    int tmp = sqrt(double(n));    for (int k=2;k<=tmp;++k)    {        if (n%k == 0)        {            return false;        }    }    return true;}//检查数j是否和第i-1个数的和构成素数,如果i为最后一个位置,则还要检查j和第一个数的和是否构成素数bool check3(const vector<int> &v,int i,int j){    int sz = v.size();    if (i == sz -1 )    {        return check2(v[i-1] + j) && check2(v[0] + j);    }    else    {        return check2(v[i-1] + j);    }}//第i个位置放jvoid fun(vector<int> &v,int i){    for (int j=1;j<=20;++j)    {        if (check1(v,i,j) && check3(v,i,j))        {            v[i] = j;            //放满20个数,则打印结果            if (i == v.size()-1)            {                printSolution(v);            }            else            {                //递归                fun(v,i+1);            }        }    }}int main(){    vector<int> v(20, 0);    v[0] = 1;    fun(v,1);    return 0;}
0 0
原创粉丝点击