【ACM】杭电OJ 4548 美素数(二次打表)

二次打表,第一次是标记哪些是素数,哪些不是。

第二次是前n个数中   “本身是素数  &&  各个位上的和是素数  ” 的个数

TLE: 

#include 
#include 
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 
#include 
#include 
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

 

你可能感兴趣的:(ACM)