神题神题啊。。
是不是感觉看不懂题目。。。
是不是感觉题目出问题了。。
其实题目本身就是一个密码。。
密码规则就是(字母+10)。
q是第17个字母,则应该减16,变成a。
OK,所以先写一个程序,把题意先弄懂。
如下:
题意:
让你求第n个反素数。(n最大为11184)
反素数(反转之后还是素数,并且不等于原来那个数)。
比如13 反转31 还是素数。
13 是第一个反素数。
解题思路:
先打表确定第11184个反素数是多少。
然后循环开到比它大一点就不会超时了。
可只所求范围内的最大反素数是999983
数组开到一百万。
代码:
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
__int64 prime[10000];
__int64 a[1222222];
__int64 sushu(__int64 a)
{
__int64 i;
__int64 k=sqrt(a);
for(i=2;i<=k;i++)
{
if(a%i==0)
return 0;
}
return 1; //判断素数
}
__int64 rev( __int64 sum )
{
__int64 now = 0;
while (sum)
{
now *= 10;
now += sum%10;
sum /= 10;
}
return now; //反转
}
int main()
{
__int64 i,j;
__int64 n;
__int64 l,l1;
l=0;
l1=1;
/*
for(i=1;i<1020022;i++)
{
if(sushu(i))
{
prime[l++]=i;
printf("%I64d\n",i);
}
}
*/ //没用的注释掉
for(i=0;i<1000000;i++)
{
if(i!=rev(i)&&sushu(rev(i)) &&sushu(i))
{
a[l1++]=i;
// printf("%d\n",i);
}
}
while(scanf("%I64d",&n)!=EOF)
{
printf("%I64d\n",a[n]);
}
return 0;
}