hdu4548 美素数

                                                                  美素数



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 1
9
 

Sample Output
  
  
Case #1: 14
Case #2: 1
Case #3: 4
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Time Limit Exceeded好几次,不光是打表找素数的还有把符合美素数的给打出来。           
代码:                                                           
#include <iostream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define MAX 1000002
int  isprime[MAX],p[MAX];

int f(int x)
{
    int i,sum=0;
    int a=x%10;
    int b=x/10%10;
    int c=x/100%10;
    int d=x/1000%10;
    int e=x/10000%10;
    int f=x/100000%10;
    int g=x/1000000%10;
    int h=x/10000000%10;
    int s=a+b+c+d+e+f+g+h;

    return s;
}
int main()
{
    for (int i=2; i<MAX; i++)
        isprime[i]=1;
    for (int i=2; i<MAX; i++)
    {
        if (isprime[i])
            for (int j=i+i; j<MAX; j+=i)
                isprime[j]=0;
    }
    int k=0;
    for(int i=1; i<MAX; i++)
    {
        if(isprime[i]&&isprime[f(i)])
            p[k++]=i;
    }
    int T,L,R,count,num=1;
    scanf("%d",&T);
    while(T--)
    {
        count=0;
        scanf("%d%d",&L,&R);
        /*  for(int i=L; i<=R; i++)
          {
              if(isprime[i]&&isprime[f(i)])
                  count++;
          }*/
        for(int i=0; i<k; i++)
        {
            if(p[i]>=L&&p[i]<=R)
              //  printf("%d ",p[i]);
            count++;
        }
        printf("Case #%d: %d\n",num++,count);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值