• 魔性的素数环1~20 自带解释~


    可以尝试一下,转到超级多哈哈哈

    题目?

    素数环定义:

      从12020个数摆成一个环,要求相邻的两个数的和是一个素数。

    【算法分析】

    非常明显,这是一道回溯的题目。从1开始,每个空位有20种可能,只要填进去的数合法:与前面的数不相同;与左边相邻的数的和是一个素数。第20个数还要判断和第1个数的和是否素数。

    【算法流程】

    1、数据初始化;   2、递归填数:判断第i个数填入是否合法;
    A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个;
    B、如果不合法:选择下一种可能;

    【代码】

    #include<iostream>
    #include<cmath>
    using namespace std;
    
    bool b[21]= {0};
    int h=0,a[21]= {0};
    
    bool pd(int x,int y) { //判断和是否为素数;
        int k=2,i=x+y;
        while(k<=sqrt(i) && i%k!=0) k++;
        if(k>sqrt(i)) return 1;//为素数;
        else return 0; //不是素数;
    }
    int print() { //输出;
        h++;//h为个数;
        cout<<"<"<<h<<">";
        for(int j=1; j<=20; j++) cout<<a[j]<<" ";
        cout<<endl;
    }
    
    int search(int t) {
        for(int i=1; i<=20; i++)
            //判断与前一个数是否构成素数及该数是否可用;
            if(pd(a[t-1],i) && (!b[i])) {
            //!b[i]是说b[i]没有被使用过~
                a[t]=i;
                b[i]=1; //将使用过的赋值为1;
                if(t==20) {
                    if(pd(a[20],a[1])) print();
                } else search(t+1);
                b[i]=0; //回溯;
            }
    }
    
    int main() {
        search(1);
        cout<<h<<endl;
        return 0;
    }

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    FreeRTOS——队列管理
    Replication Controller、Replica Set
    基本概念与组件
    YAML配置文件
    curl命令测试服务器是否支持断点续传
    浏览器http跳转至https问题
    常用Linux日志文件功能
    SSH连接时,长时间不操作就断开的解觉办法
    防HTTP慢速攻击的nginx安全配置
    Centos6.5升级安装openssh7.7p1
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6603718.html
Copyright © 2020-2023  润新知