题目:美素数
题目链接:https://vjudge.net/contest/351853#problem/G
题目描述:
美素数:各位相加后,依然是素数。
在给出区间内找美素数的个数。
1.得出素数表
2.找美素数
3.标记美素数的位置
4.通过位置得区间美素数个数。
代码:
#include <stdio.h>
int a[1000000],b[80000],c[80000];
int f(int x)//找各位相加的出的结果
{
int d=0;
while(x/10)
{
d+=x%10;
x/=10;
}
return x+d;
}
int main()
{
int i,k,j,s,t,g;
for(i=0;i<1e6;i++)
{
a[i]=i;
}
for(i=2,k=0;i<5e5;i++) //用线性筛搞个质数表
{
if(a[i]) b[k++]=i;
for(j=0;j<k;j++)
{
if(b[j]*i>1e6) break;
a[b[j]*i]=0;
if(i%b[j]==0) break;
}
}
for(i=5e5;i<1e6;i++)
{
if(a[i]) b[k++]=i;
}
for(i=0,j=0;i<k;i++)
{
if(a[f(b[i])]) c[j++]=b[i];//判断是否为美素数,并存起来
}
for(i=0;i<j;i++)
{
a[c[i]]=i;//再次利用被挖数组标记被挖美素数对应位置
}
scanf("%d",&t);
k=1;
while(t--)
{
scanf("%d%d",&s,&g);
for(i=0;i<j;i++)
{
if(s<=c[i]) {s=i;break;}//找区间
}
for(i=j-1;i>=0;i--)
{
if(g>=c[i]) {g=i;break;}
}
printf("Case #%d: %d\n",k++,a[c[g]]-a[c[s]]+1);//得出美素数位置
}
return 0;
}
(以后不知道还能不能看懂这段代码)
来源:CSDN
作者:jian_ke
链接:https://blog.csdn.net/jian_ke/article/details/104063614