美素数
Problem Description
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
Input
第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
Output
对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。
每组数据占一行,具体输出格式参见样例。
Sample Input
31 1002 23 19
Sample Output
Case #1: 14Case #2: 1Case #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;
}