因为要准备复试机试就每天刷两道题
C - 镜中的质数 EOlymp - 22
一个质数,若将其各位从右向左读仍是质数,我们则称之为“镜质数”.
请你求出区间[a, b]当中所有“镜质数”的个数.
数据输入
在一行中给出两个整数 a 和 b (1 ≤ a ≤ b ≤ 10000),中间用一个空格分隔.
Output
输出一个整数,是区间[a,b]当中“镜质数”的个数.
Example 1
Input example #1
10 25
Output example #1
3
我的代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int prime[10000],pNum=0;
bool p[10000]={0};
void Find_Prime()
{
for(int i=2;i<10000;i++)
{
if(p[i]==false)
{
prime[pNum++]=i;
for(int j=i+i;j<10000;j+=i)
{
p[j]=true;
}
}
}
}
int main()
{
int a,b;
cin>>a;
cin>>b;
Find_Prime();
p[1]=1;
int sum=0;
for(int i=a;i<=b;i++)
{
if(p[i]==false)
{
string s=to_string(i);
reverse(s.begin(),s.end());
int x=stoi(s,0,10);
if(p[x]==false)
{
sum++;
}
}
}
cout<<sum<<endl;
}
参考答案
#include <cstdio>
#include <cstring>
#define MAXN 10007
char isPrime[MAXN];
void init()
{
memset(isPrime,1,sizeof(isPrime));
isPrime[0]=0;
isPrime[1]=0;
int i,j;
for(i=2;i*i<=MAXN;i++)
{
if(isPrime[i]==0)
continue;
for(j=i*i;j<MAXN;j+=i)
isPrime[j]=0;
}
return ;
}
int mirror(int x)
{
int r=0;
while (x>0)
{
r=r*10+x%10;
x/=10;
}
return r;
}
int main(void)
{
init();
int i,lwbd,upbd,r;
scanf("%d%d",&lwbd,&upbd);
int counter=0;
for(i=lwbd;i<=upbd;i++)
{
r=mirror(i);
if(isPrime[i] && isPrime[r])
counter+=1;
}
printf("%d\n",counter);
return 0;
}
反思
用了素数筛的方法,这道题没有卡时间,用常规方法也能做
每次考虑素数的时候都得想一下1不是素数,一不小心就忘了。
另外to_string和stoi是真的好用,省去写函数的麻烦。