Prime Palindromes chapter 1.5

  求回文素数,开始直接枚举判断果断tle,后来网上找优化,发现除了11,偶数长度的回文数都可以被11整出,应为上限是100,000,000,所以只需要在长度为 1,3,5,7里寻找(11除外),

看到大牛门直接先用循环生成长度为奇数的回文数再判断素数,我偷鸡了下,直接在a=<i=<b里加速,if(i=999) i=10001...勉强过了 万幸,生成方法参考http://www.cnblogs.com/zjbztianya/archive/2013/01/31/2886509.html

/*

ID: hubiao cave

PROG: pprime

LANG: C++

*/




#include<iostream>

#include<fstream>

#include<string>

using namespace std;


bool IsPrime(int);
bool IsPa(int);
char buf[10];
bool getLength(int n);
int main()

{

    ifstream fin("pprime.in");

    ofstream fout("pprime.out");
    int a,b;
    fin>>a>>b;

    for(int i=a;i<=b;i++)
    {
        if(i==999)
        {
            i=10001;
        }
        if(i==99999)
        {
            i=1000001;
        }
        if(i==9999999)
            break;
        if(IsPa(i))
            if(IsPrime(i))
            fout<<i<<endl;
    }


    

    return 0;


}

bool IsPrime(int n)
{
    if(n/5==0&&n>5)
        return false;
    if(n==5)
        return true;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
            return false;
    }
    return true;
}

bool IsPa(int n)
{
    int m=n,i=1;
    while(m/10)
    {
        buf[i]=m%10;
        i++;
        m=m/10;
    }
    buf[i]=m;
    if(i==1)
        return true;
    for(int p=1;p<=i;p++)
    {
        if(buf[p]!=buf[i-p+1])
            return false;
    }
    return true;

}
bool getLength(int n)
{
    if(n==11)
        return true;
    if(n/10>=1&&n/10<=9)
        return false;
    if(n/1000>=1&&n/1000<=9)
        return false;
    if(n/100000>=1&&n/100000<=9)
        return false;
    if(n/10000000>=1&&n/10000000<=9)
        return false;
    return true;
}

 

 

posted @ 2013-08-15 21:41  cavehubiao  阅读(172)  评论(0)    收藏  举报