给定两个边界,求输出所有这个边界以内,既是素数又是回文的数字;
一开始用的素数筛,爆内存了。
改为生成回文后检测是否为素数,在如何递归生成回文上卡了很久。一直纠结于边界情况的处理。
/* ID: modengd1 PROG: pprime LANG: C++ */ #include <iostream> #include <stdio.h> #include <string.h> #include <memory.h> #include <math.h> using namespace std; typedef long long ll; long long A,B; bool IsPrime(int x) { if(x==2) return true; if(x%2==0) return false; for(int i=3;i*i<=x;i++) { if(x%i==0) return false; } return true; } void slove(int deep,int limit,int fro,int tair)//deep为当前回文串的长度,limit为要求的回文串的长度,fro为生成的回文串的前半部分,tair为后半部分,当前后不一样长时将中间的数字划分到前半部分 { int ans; if(deep==limit) { ans=fro*pow(10,(deep/2))+tair; if(ans<A||ans>B)//检查是否超出边界 return; if(IsPrime(ans)) { cout<<ans<<endl; } return; } if((limit-deep)==1)//如果需要求的回文串长度为奇数,且已经生成了除最中间的数字以外的前后两部分之后 { for(int i=fro==0?1:0;i<10;i++) { slove(deep+1,limit,fro*10+i,tair); } } else//给fro的末尾加一个数字,给tair的前面加相同的数字 { for(int i=fro==0?1:0;i<10;i++) { slove(deep+2,limit,fro*10+i,pow(10,(deep/2))*i+tair); } } } int main() { freopen("pprime.in","r",stdin); freopen("pprime.out","w",stdout); cin>>A>>B; int st,en; //得出边界的位数 for( st=0;A>pow(10,st);st++); for( en=0;B>pow(10,en);en++); for(int i=st;i<=en;i++) { slove(0,i,0,0); } return 0; }
时间: 2024-12-11 06:07:20