魔性的素数环1~20 自带解释~
生活随笔
收集整理的這篇文章主要介紹了
魔性的素数环1~20 自带解释~
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可以嘗試一下,轉到超級多哈哈哈
題目?
素數環定義:
從1到20這20個數擺成一個環,要求相鄰的兩個數的和是一個素數。
【算法分析】
非常明顯,這是一道回溯的題目。從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;
}
如果運氣好也是錯,那我倒愿意錯上加錯!
?????????????????????
如果人生會有很長,愿你的榮耀永不散場
總結
以上是生活随笔為你收集整理的魔性的素数环1~20 自带解释~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: deepin15.7挂载/home到单独
- 下一篇: 乱七八糟却非常重要的一些东西