美素数

题目链接: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 }

      

     

原文地址:https://www.cnblogs.com/q-c-y/p/4748883.html