1. 程式人生 > >洛谷P1217回文質數-Prime Palindrome回溯

洛谷P1217回文質數-Prime Palindrome回溯

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回溯