P1217
难度:4/10
总结
1 同时试验了O(k*根号n)的质数试验法和O(nloglogn)≈O(n)的埃氏筛法,虽然看上去筛法更快,但是,当k不大且n不小的时候,即真正所需知道是否的质数的数不多时,朴素的挨个试验法其实更快,两个方法的代码都在这里。
2 scanf/printf功能更强大而且读写速度几乎比cin/cout快了一倍,所以请尽量使用scanf/printf
3 TLE时,可以试试把scanf/printf替换成更加快速的基于getchar()的快读快写函数(需要理解并记忆)
4 别瞧不起打表,TLE时试试打表。且同一题中打表可能有多种打法,有些打法出来的表就很小,可以用这种(比如本题中打质数表和答案表都可以,但后者显然小得多得多)。
5 就算实在不想打表,也可以半打表,即通过观察TLE程序的最终输出,寻找无需计算的部分进行优化(比如本题中发现8位数中根本没有符合题意的数字,所以算到10000000时直接不算了)
Code
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
int p(int a)
{
if(a==1)return 0;if(a==2)return 1;
for(int i=2;i<=sqrt(a);i++)
if(a%i==0)return 0;
return 1;
}
/*
bool p[100000001];
void p2(int b)
{
for(int i=1;i<=b;i++)p[i]=1;
p[1]=0;p[2]=1;int P=2;
while(P!=b)
{
if(p[P]==1)
{
for(int i=2;i*P<b;i++)
{
p[i*P]=0;
}
}
P++;
}
return;
}
*/
int f(int x)
{
int no=0,a[10];
while(x!=0)
{
no++;
a[no]=x%10;
x/=10;
}
for(int i=1;i<=no/2;i++)
{
if(a[i]!=a[no+1-i])
return 0;
}
return 1;
}
int main()
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
if(f(i)==1)
if(p(i)==1)
printf("%d\n",i);
if(i==9989899)break;//半打表,这个数之后没有回文数了所以直接停止
}
return 0;
}