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; }