首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-03-06 
zoj 1951 超时了,哪儿的问题啊??#includestdio.h#defineN1000000voidinit(intarray[],intn){intifor(i

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;
}
}

热点排行