二次打表,第一次是标记哪些是素数,哪些不是。
第二次是前n个数中 “本身是素数 && 各个位上的和是素数 ” 的个数
TLE:
#include <iostream>
#include <cstdio>
using namespace std;
int fun1(int x)
{
int sum=0;
while(x>0)
{
sum+=x%10;
x/=10;
}
return sum;
}
int isprime(int num)
{
if(num==1)
return 0;
if(num==3 || num==2)
return 1;
if(num%6!=1 && num%6!=5)
return 0;
int t=sqrt((double)num);
for(int i=5;i<=t;i+=6)
{
if(num%i==0 || num%(i+2)==0)
return 0;
}
return 1;
}
int main ()
{
int T,p,count;
int i,L,R,j;
scanf("%d",&T);
for(i=1;i<=T;i++)
{
count=0;
scanf("%d%d",&L,&R);
for(j=L;j<=R;j++)
{
p=fun1(j);
if(isprime(j) && isprime(p))
{
count++;
}
}
printf("Case #%d: %d\n",i,count);
}
return 0;
}
AC:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000000+10;
int a[maxn];
int b[maxn];
int fun1(int x)
{
int sum=0;
while(x)
{
sum+=x%10;
x/=10;
}
return sum;
}
void fun2()
{
int i,j;
memset(a,1,sizeof(a));
a[0]=0;
a[1]=0;
for(i=2;i<maxn;i++)
{
if(!a[i]) continue;
for(j=i*2;j<maxn;j+=i)
{
a[j]=0;
}
}
return ;
}
int main ()
{
int i,j,p,T,R,L;
fun2();
memset(b,0,sizeof(b));
for(i=1;i<maxn;i++)
{
if(a[i] && a[fun1(i)])
{
b[i]=b[i-1]+1;
}
else
{
b[i]=b[i-1];
}
}
scanf("%d",&T);
for(p=1;p<=T;p++)
{
scanf("%d%d",&L,&R);
printf("Case #%d: %d\n",p,b[R]-b[L-1]);
}
return 0;
}
687


&spm=1001.2101.3001.11974&articleId=85036756&d=1&t=3&u=e8774845240e4bdb9ba89eb020ceda41)

被折叠的 条评论
为什么被折叠?



