HDU-4548 美素数

Posted harutomimori

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-4548 美素数相关的知识,希望对你有一定的参考价值。

Problem Description
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
 
Input
第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共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
 
思路:
  1. 埃拉托色尼筛法筛出素数表isprime[ ]
  2. prime_sum[ ]表示1到i之间素数的个数
  3. 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 }

 

 





以上是关于HDU-4548 美素数的主要内容,如果未能解决你的问题,请参考以下文章

HDU--4548 美素数

HDU-4548 美素数

HDU4548 美素数打表前缀和

G - 美素数

周一s:E - 美素数

HDOJ4548-美素数(前缀和,线性筛)