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

来源:互联网 发布:淘宝1块包邮的有什么 编辑:程序博客网 时间:2024/06/05 14:45

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

给定四个整数(可正可负)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
原创粉丝点击