非筛法思路正解
查看原帖
非筛法思路正解
288782
痴人说梦wza楼主2021/11/12 11:42

非筛法思路正解,题解那边丢不上去想看的可以看看。

题解都是举例质数,这里选择举例回文,由于数据最大是100 000 000 ,这里选择举例回文左侧,右侧通过求反得到,那么只要枚举 100000 不到即可。最后判断质数,范围。

实际复杂度只有 sqrt(n)*sqrt(n)=n 左右。

最后只要把回文质数存下来在排个序就好了,实际数量并不多。

#include<iostream>
#include<algorithm>
using namespace std;
int n,m,ans[200005],len;
int trans1(int x){
	int sum=0;
	while(x!=0){
		sum=sum*10+x%10;
		x/=10;
	}
	return sum;
}
int trans2(int x){
	int sum=1;
	while(x!=0){
		sum=sum*10;
		x/=10;
	}
	return sum;
}
bool check(int x){
	if(x==1) return false;
	if(x<n || x>m) return false;
	for(int i=2;i*i<=x;i++) if(x%i==0) return false;
	return true;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=100000;i++){
	   int x1=i*trans2(i)+trans1(i);
	   int x2=i/10*trans2(i)+trans1(i);
	   if( check(x1) == true) ans[len++]=x1;
	   if( check(x2) == true) ans[len++]=x2;
	}
	sort(ans,ans+len);
	for(int i=0;i<len;i++)
		cout<<ans[i]<<endl;
	return 0;
} 
2021/11/12 11:42
加载中...