题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/H
题意:
一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”。计算在所输入的区间中有多少个美素数。
案例:
input
3
1 100
2 2
3 19
output
Case #1: 14
Case #2: 1
Case #3: 4
思路分析:
最多可能有1000000个数,又最多有10000种案例,最坏的情况会是循环10000000000次,数过大,会超时,应该要进行打表。
把所有数都标记为1,先找出所有不是素数的数标记为0(去掉),再找出满足条件的素数,计录从1开始到i的所有满足条件的数的个数b[i]。
在案例输入后,只要输出b[R]-b[L-1]即可。
源代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAX 1000000 5 using namespace std; 6 int a[MAX+5],b[MAX+5]; 7 int main() 8 { 9 int T,L,R,i,j,t=0; 10 for(i=2;i<=MAX;i++) 11 a[i]=1; 12 b[0]=a[0]=a[1]=0; 13 for(i=2;i<=1000;i++) 14 if(a[i]) 15 for(j=i*i;j<=MAX;j+=i) 16 a[j]=0; 17 for(i=1;i<=MAX;i++) 18 { 19 b[i]=b[i-1]+a[i]; 20 if(a[i]) 21 { 22 int k=i,sum=0; 23 while(k) 24 { 25 sum+=k%10; 26 k=k/10; 27 } 28 if(!a[sum]) 29 b[i]=b[i]-1; 30 } 31 } 32 scanf("%d",&T); 33 while(T--) 34 { 35 scanf("%d%d",&L,&R); 36 printf("Case #%d: %d ",++t,b[R]-b[L-1]); 37 } 38 return 0; 39 }