zoukankan      html  css  js  c++  java
  • 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 }
     
    ————————————————
    心里有光,哪儿都美
  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/harutomimori/p/9863109.html
Copyright © 2011-2022 走看看