遇到一道题,描述是这样的:
给定四个整数(可正可负)a,b,c,d。其中,a,b一组,c,d一组,以下面的方式计算得到一个值:
X = (a*a+b*b)*(c*c+d*d)
要求出另外的能组成X的两个整数e,f,满足以下条件:
e*e+f*f = X
另外,要求e,f 中至少有一个必须是 |a*c+b*d| 和 |a*c-b*d| 中的数。
最后返回成对的(e,f)
以上。
我的算法是这样的:
#include <vector>
#include <iostream>
using namespace std;
class SqProd2Sum
{
public:
static std::vector<std::pair <long, long>> prod2Sum(long long a, long long b, long long c, long long d);
};
std::vector<pair<long, long> > SqProd2Sum::prod2Sum(long long a, long long b, long long c, long long d){
std::vector<pair<long, long> > lvec;
long long temp = (a*a+b*b)*(c*c+d*d);
long long left=a*c-b*d;
if(left<0)
left=-left;
long long right=a*c+b*d;
if(right<0)
right=-right;
for(long i=0;i*i<=temp/2;i++){
long iSq=i*i;
for(long j=0;j*j<=temp-iSq;j++){
long jSq=j*j;
if(left==i || i==right ){
if((temp-iSq)==jSq)
lvec.push_back(make_pair(i,j));
}
else if(left == j || j==right){
if((temp-iSq)==jSq)
lvec.push_back(make_pair(i,j));
}
}
}
return lvec;
}
这次想把它放在网上作为记录,希望自己以后能有解决方法。小生之前没研究过算法优化这部分,如果有前辈知道优化方案,敬请告知。
以上。