优化:4数平方和之积转换为2数平方之和

遇到一道题,描述是这样的:

给定四个整数(可正可负)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;
}


从测试结果看,这份代码的结果是没什么问题,但是它用时过长,应该是嵌套的循环耗时太久(测试会使用很大的输入-上亿,必然超时12000ms)

这次想把它放在网上作为记录,希望自己以后能有解决方法。小生之前没研究过算法优化这部分,如果有前辈知道优化方案,敬请告知。

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值