标签:
给定两个边界,求输出所有这个边界以内,既是素数又是回文的数字;
一开始用的素数筛,爆内存了。
改为生成回文后检测是否为素数,在如何递归生成回文上卡了很久。一直纠结于边界情况的处理。
/*
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;
}
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4768176.html