加速问题
今天写个程序,用一个数组存下从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];

浙公网安备 33010602011771号