本题链接
把所有美素数求出来打一个表,数组中存从1到当位置有多少美素数。当前位置不是美素数的要记录为前一个美素的值,输出直接用区间右值的美素数个减区左值前一个美素数。
#include <iostream>
#include <cstdio>
using namespace std;
int a[1000100];
int b[1000100];
bool funtc(int n)
{
for(int i=2; i*i<=n; i++)
if(n%i==0)
return false;
return true;
}
int Init()
{
int sum=0;
for(int i=2; i<1000100; i++)
{
if(funtc(i))
{
a[i]++;
int n=i,num=0;
while(n>0)
{
num+=(n%10);
n/=10;
}
if(a[num]&&a[i])
sum++;
}
b[i]=sum;
}
}
int main()
{
Init();
int T;
scanf("%d",&T);
for(int Case=1; Case<=T; Case++)
{
int L,R;
scanf("%d%d",&L,&R);
printf("Case #%d: %d\n",Case,b[R]-b[L-1]);
}
}