题目链接:https://projecteuler.net/problem=35
直接暴力所有1e6之内素数就好了
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5;
int prime[MAXN],pow10[10];;//保存素数
bool vis[MAXN];//初始化
int cnt=0;
void Prime(int n=MAXN)
{
memset(vis,0,sizeof(vis));
vis[1]=1;
pow10[0]=1;
for(int i=1;i<10;i++)
{
pow10[i]=pow10[i-1]*10;
}
for(int i=2;i<n;i++)
{
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<n;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)//关键
break;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
Prime(1000000);
int ans=0;
for(int i=0;i<cnt;i++)
{
int x=prime[i],div;
for(int j=0;j<10;j++)
{
if(x/pow10[j]!=0)
div=pow10[j];
}
bool flag=true;
do
{
x=(x/10)+(x%10)*div;
if(vis[x])
flag=false;
}while(x!=prime[i]&&flag);
if(flag)
ans++;
}
printf("%d\n",ans);
return 0;
}