洛谷P1217回文質數-Prime Palindrome回溯
阿新 • • 發佈:2018-02-17
lan blank cst 區間 log oid pro ont 回溯
P1217 [USACO1.5]回文質數 Prime Palindromes
題意:給定一個區間,輸出其中的回文質數;
學習了洛谷大佬的回溯寫法,感覺自己寫回溯的能力不是很強;
#include <cstdio> #include <iostream> #include <cmath> const int maxn = 100; using namespace std; int a[maxn],l,r; bool is_prime(int n) //判斷素數 { int x = sqrt(n); for(int i=2;i<=x;i++) {if(n%i==0)return false; } return true; } void dfs(int n,int t) { if(t>(n+1)/2) //如果當前已有的數字可以構成回文串;就接下去做 { int s = 0; for(int i=1;i<=n/2;i++) { a[n-i+1] = a[i]; //制作回文 } for(int i=1;i<=n;i++) { s= s*10 + a[i]; //把數組匯總成數字; } if(s<l||s>r)return; //不符合要求則return if(is_prime(s)) cout<<s<<endl; //若為素數則輸出 } else { for(int i=(t==1);i<=9;i+=(t==1)+1) //一個一個進行放 { //這裏有個操作:若放的數字還是個位數字,就只能從1開始,每次加2;若不是個位,從0開始,每次加1; a[t]=i; dfs(n,t+1); } } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>l>>r; for(int i=ceil(log10(l));i<=ceil(log10(r));i++)//對各個位數的回文素數進行搜索,ceil(log10(r))是r的位數 dfs(i,1); return 0; }
洛谷P1217回文質數-Prime Palindrome回溯