• 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 }
     
    ————————————————
    心里有光,哪儿都美
  • 相关阅读:
    开学测试感想
    动手动脑1(00JAVA语言基础)
    9.29 java web注释方式以及servlet映射
    三十道随机算法
    9.30 servlet学习
    C#验证控件的使用方法
    SqlHelper详解
    C#字符串的几种常用方法
    存储过程事务处理
    js url编码
  • 原文地址:https://www.cnblogs.com/harutomimori/p/9863109.html
Copyright © 2020-2023  润新知