http://acm.hdu.edu.cn/showproblem.php?pid=4548
美素数是指所有位累加和仍是一个素数的素数。
所以,可以先打表求出1——1000000之间所有的素数。1——1000000之间的所有素数个数为78498个。
然后在这么多个素数中进行判断,将是美素数的数再存到一个数组里面,1——1000000之间的美素数有30123个。
美素数是指所有位累加和仍是一个素数的素数。
所以,可以先打表求出1——1000000之间所有的素数。1——1000000之间的所有素数个数为78498个。
然后在这么多个素数中进行判断,将是美素数的数再存到一个数组里面,1——1000000之间的美素数有30123个。
以后每次区间询问的时候,就可以在该数组进行遍历查找。
代码:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define N 1000001
bool visit[N];
int prime[N];
int perfect_prime[N];
int num = 0;
void make_prime()
{
memset(visit,true,sizeof(visit));
for(int i=2; i<=N; i++)
{
if(visit[i])
{
num++;
prime[num] = i;
}
for(int j=1; (j<=num)&&(i*prime[j] <= N); j++)
{
visit[i*prime[j]] = false;
if(!(i%prime[j])) break;
}
}
}
bool judge_prime(int n)
{
if(n == 2) return true;
int k = (int)sqrt(double(n));
for(int i=1; i<=k; i++)
{
if(!(n%prime[i])) return false;
}
return true;
}
bool bit_prime(int n)
{
int ans = 0;
while(n)
{
ans+= n%10;
n/=10;
}
return judge_prime(ans);
}
int init()
{
make_prime();
int cnt=0;
for(int i=1; i<=num; i++)
{
if(bit_prime(prime[i]))
{
perfect_prime[cnt++] = prime[i];
}
}
return cnt;
}
int main()
{
int t;
int n,m;
int _case = 0;
int ret = init();
//printf("%d -- %d\n",num,ret);
scanf("%d%*c",&t);
while(t--)
{
_case++;
int ans = 0;
scanf("%d%d",&n,&m);
for(int i=0; i<ret; i++)
if(perfect_prime[i]>=n && perfect_prime[i]<=m) ans++;
printf("Case #%d: %d\n",_case,ans);
}
return 0;
}