您的位置:首页 > 其它

2013金山西山居创意游戏程序挑战赛——初赛(2) A 美素数(hdu 4548)

2013-05-19 19:42 459 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4548

题意:所谓美素数就是指的其本身是素数且其十进制各位数之和也为素数的数,现在问你区间[l,r]内有多少个美素数。

因为数据量很小,所以直接暴力就行,素数打表暴力枚举每个数看是否是美素数,维护一个数组a[i]表示区间[1,i]之间的美素数的个数,然后就不用说了吧,对于输入x,y,输出a[y]-a[x-1]即可。

代码如下:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#define maxn 1000000
using namespace std;
int p[maxn+10];
void prime()
{
memset(p,0,sizeof(p));
int i=0,sum=0,x=0;
p[0]=1;
p[1]=1;
for(i=2;i<=maxn;i++)
{
sum=i;
x=2;
if(p[sum]==1)
continue;
sum=i*x;
while(sum<=maxn)
{
p[sum]=1;
x++;
sum=i*x;
}
}
}
int sum[maxn+10];
int check(int x)
{
int tmp=0;
while(x)
{
tmp+=x%10;
x/=10;
}
if(!p[tmp])
return 1;
return 0;
}
int main()
{
// freopen("dd.txt","r",stdin);
prime();
sum[1]=sum[0]=0;
for(int i=2;i<=maxn;i++)
{
if(!p[i]&&check(i))
sum[i]=sum[i-1]+1;
else
sum[i]=sum[i-1];
}
int ncase,time=0;
scanf("%d",&ncase);
while(ncase--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("Case #%d: %d\n",++time,sum[b]-sum[a-1]);
}
return 0;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐