zoukankan      html  css  js  c++  java
  • 魔性的素数环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;
    }

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

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

  • 相关阅读:
    Kali安装输入法
    各类16进制文件头
    KALI搭建DVWA
    [LeetCode]子串的最大出现次数(字符串)
    [LeetCode]415. 字符串相加、43. 字符串相乘
    [LeetCode]1249. 移除无效的括号(字符串,栈)
    [Leetcode]585. 2016年的投资(MySQL)
    [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)
    [LeetCode]1071. 字符串的最大公因子(gcd)
    [LeetCode]Sql系列4
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6603718.html
Copyright © 2011-2022 走看看