Problem Description
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
Input
第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
Output
对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。
每组数据占一行,具体输出格式参见样例。
每组数据占一行,具体输出格式参见样例。
Sample Input
3
1 100
2 2
3 19
Sample Output
Case #1: 14
Case #2: 1
Case #3: 4
思路:
- 埃拉托色尼筛法筛出素数表isprime[ ]
- prime_sum[ ]表示1到i之间素数的个数
- sum[ ]存储每一个case中美素数的个数
备注:
- memset函数的用法
- 局部变量的数组受限于栈空间,应定义为全局变量数组
- 素数筛
- l到r的美素数个数应为prime_sum[r]-prime[l-1]
1 #include<stdio.h> 2 #include<math.h> 3 #include<iostream> 4 #include<string.h> 5 using namespace std; 6 #define max 1000000 7 bool isprime[max+1]; 8 int prime_sum[max+1]; 9 int sum[max+1]; 10 //素数表 11 void prime() 12 { 13 memset(isprime,true,sizeof(isprime));//初始化数组 14 isprime[1]=0; 15 for(int i=2;i<=max;i++) 16 { 17 18 if(isprime[i]==1)//素数为1 19 { 20 for(int j=i*2;j<=max;j+=i) 21 { 22 isprime[j]=false; 23 } 24 } 25 } 26 } 27 //1-i的美素数个数 28 void pprime() 29 { 30 for(int i=2;i<=max;i++) 31 { 32 int s=0,j=i; 33 prime_sum[i]=prime_sum[i-1]; 34 if(isprime[i]) 35 { 36 37 while(j) 38 { 39 s+=j%10; 40 j/=10; 41 } 42 if(isprime[s]) 43 { 44 prime_sum[i]++; 45 } 46 } 47 } 48 } 49 int main() 50 { 51 int n; 52 scanf("%d",&n); 53 prime(); 54 pprime(); 55 for(int i=1;i<=n;i++) 56 { 57 int l,r; 58 scanf("%d %d",&l,&r); 59 sum[i]=prime_sum[r]-prime_sum[l-1]; 60 printf("Case #%d: %d ",i,sum[i]); 61 62 }
//加入调试代码检查打表是否正确 63 // prime(); 64 // pprime(); 65 // for(int i=2;i<101;i++) 66 // { 67 // printf("第%d个元素:%d ",i,isprime[i]); 68 // printf("1-%d有%d个美素数 ",i,prime_sum[i]); 69 // } 70 return 0; 71 }