链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4548
美素数:本身是素数,并且各位数字的和也是素数
打出素数表,再对各位数字求和,访问素数表考察各位和是否为素数
详见代码:
#include <iostream>
#include <cstring>
#define MAX 1000001
using namespace std;
bool prime[MAX];<span style="white-space:pre"> </span>//素数表
int ans[MAX];<span style="white-space:pre"> </span>//ans数组记录区间内美素数的个数
int for_sum(int n)<span style="white-space:pre"> </span>//求各位数字和
{
int sum=0;
while(n)
{
sum+=n%10;
n/=10;
}
return sum;
}
void pre()
{
memset(prime,1,sizeof(prime));
prime[0]=prime[1]=0;
for(int i=2;i<MAX;i++)<span style="white-space:pre"> </span>//判断素数
if(prime[i])
for(int j=i*2;j<MAX;j+=i)<span style="white-space:pre"> </span>//若j=i*i,则需定义__int64 j
prime[j]=0;
for(int i=1;i<MAX;i++) ans[i]=(prime[i] && prime[for_sum(i)]) ? 1 : 0;<span style="white-space:pre"> </span>//调用求和,考察各位和是否为素数
for(int i=1;i<MAX;i++) ans[i]+=ans[i-1];<span style="white-space:pre"> </span>//e.g ans[1]=0; ans[2]=ans[1]+ans[2]=1; ans[3]=ans[2]+ans[3]=2;
}
int main()
{
pre();
int T,n,m,k=1;
cin>>T;
while(T-- && cin>>n>>m)
cout<<"Case #"<<k++<<": "<<ans[m]-ans[n-1]<<endl;
return 0;
}