求回文素数,开始直接枚举判断果断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;
}
原文链接: https://www.cnblogs.com/cavehubiao/p/3260933.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/100136
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!