素数打表:
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),速度大大提升了,因此不会超时而通过了。
这到题的收获是,铸聪师兄教会我算时间复杂度,和筛子法求素数打表。在这里感谢师兄不厌其烦地给我分析,讲解,谢谢师兄!