poj2262筛子法素数打表

素数打表:

void oddp()
{
	int i,j;
	for(i=0;i<1000000;i++) a[i]=1;
	a[0]=0; a[1]=0;
	for(i=2;i<1000000;i++)
	{
		if(a[i]==1)
		{
			for(j=i*2;j<1000000;j+=i) a[j]=0;
		}
	}
}

结合POJ2262代码:

int main()
{
	int num;
	int i,flag;
	oddp();
	while(scanf("%d",&num)!=EOF&&num!=0)
	{
		for(flag=0,i=2;i<num;i++)
		{
			if(a[i]==1&&a[num-i]==1)
			{
				printf("%d = %d + %d\n",num,i,num-i);
				flag=1;
				break;
			}
		}
		if(flag==0)
			printf("Goldbach's conjecture is wrong.\n");
	}
	return 0;
}

   瓶颈就在这里,之前用的是O(n^2),这里的时间复杂度O(n),速度大大提升了,因此不会超时而通过了。

    这到题的收获是,铸聪师兄教会我算时间复杂度,和筛子法求素数打表。在这里感谢师兄不厌其烦地给我分析,讲解,谢谢师兄!

 
posted @ 2011-04-29 09:59  Veegin  阅读(1719)  评论(1编辑  收藏  举报