hdu-美素数
美素数
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 #include<stdio.h> 2 #include<string.h> 3 4 #define maxn 1000005 5 6 int prime[maxn], ans[maxn]; 7 8 void is_prime() //素数打表 9 { 10 int i, j; 11 memset(prime,0,sizeof(prime)); 12 memset(ans,0,sizeof(ans)); 13 prime[0] = prime[1] = 1; 14 for (i = 2; i < maxn; i++) 15 { 16 if (prime[i]) 17 continue; 18 for (j = i + i; j <maxn; j += i) 19 { 20 prime[j] = 1; 21 } 22 } 23 } 24 25 int sum(int n) //一个数的各位数字和 26 { 27 int sum = 0; 28 while (n) 29 { 30 sum += n % 10; 31 n /= 10; 32 } 33 return sum; 34 } 35 36 void count() 37 { 38 int i; 39 ans[0] = ans[1] = 0; 40 for (i = 2; i < maxn; i++) 41 { 42 if (!prime[i] && !prime[sum(i)]) 43 ans[i] = ans[i - 1] + 1; //如果是美素数,则+1 44 else 45 ans[i] = ans[i - 1]; //用数组ans来计数,输入多组数据,只需在一开始全算出来,只需调用一次 46 } 47 } 48 49 int main() 50 { 51 int t, l, r, i = 1; 52 is_prime(); 53 count(); 54 scanf("%d", &t); 55 while (t--) 56 { 57 scanf("%d %d", &l, &r); 58 printf("Case #%d: %d\n",i++,ans[r] - ans[l - 1]); 59 } 60 return 0; 61 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步