Kai’blog

主博客 | 势利纷华,近之而不染者洁,不近者亦洁,君子不立危墙之下。

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;
}
posted @ 2023-07-01 23:08  Kai-G  阅读(16)  评论(0编辑  收藏  举报
Copyright © 2019-2020 拱垲. All rights reserved.