加速问题

今天写个程序,用一个数组存下从0到M的任意两个数的平方和,我以为我用的是最快的方法。

我的方法是利用他的结构利用合并排序

void Merge(int left,int mid,int right)//合并有序数组 
{
     int i=left,j=mid+1,l=0,s=0;
     while(i<=mid&&j<=right)
     {
        if(b[i]<b[j]) p[l++]=b[i++];
        else if(b[i]>b[j])        p[l++]=b[j++];
             else    {p[l++]=b[i++];j++;s++;}
     }
     length-=s;
     while(i<=mid) p[l++]=b[i++];
     while(j<=right) p[l++]=b[j++];
     for(i=left,l=0;i<=right-s;i++)
         b[i]=p[l++];
         
}
for(int p=0;p<=M;p++)
         {lastlength=length;
          for(int q=p;q<=M;q++)
            b[length++]=p*p+q*q;
            Merge(0,lastlength-1,length-1);
         } 

 可是后来还是不能通过,用是太长了

看了别人的我才发现,真是太巧妙了,这是谁想到的:

for(int p=0;p<=M;p++)
for(int q=p;q<=M;q++)
bi[p*p+q*q]=true;
length=0;
for(int i=0;i<62501;i++)
if(bi[i]) b[length++]=i;

说明:全局数组

int b[62500],p[62500];

bool bi[62501];

posted @ 2012-03-10 15:52  无殇天下  阅读(149)  评论(0)    收藏  举报