读书人

zoj 1951 超时了哪儿的有关问题啊

发布时间: 2012-03-06 20:47:55 作者: rapoo

zoj 1951 超时了,哪儿的问题啊??
#include <stdio.h>
#define N 1000000

void init(int array[],int n)
{
int i;
for(i=0;i <n;i++)
array[i]=i;
}

void prime(int array[],int n)
{
int i,j;
for(i=2;i <n;i++)
if(array[i]!=0)
for(j=i+i;j <n;j+=i)
array[j]=0;
}

int output(int array[],int n,int a[])
{
int i,j=0;
for(i=2;i <n;i++)
if(array[i]!=0)
{
a[j]=array[i];
j++;
}
return j;
}

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


}
}



[解决办法]
二重循环求解,能不time out 吗?
for(i=0;i <num;i++)
{
for(j=num-1;j> =0;j--)
{
if(n-a[i]==a[j])
{
t=1;
break;
}
}
if(t==1)
{
flag=1;
printf( "%d = %d + %d\n ",n,a[i],n-a[i]);
break;
}
}
改成:
for(i=0;i <num;i++)
{
if(arr[n-a[i]]!=0){
flag=1;
printf( "%d = %d + %d\n ",n,a[i],n-a[i]);
break;
}
}

读书人网 >软件架构设计

热点推荐