我被问到这个面试问题。面试结束后,我在谷歌上搜索了两个小时,我还没有找到一个答案,我猜这是一个常见的面试问题。我想提高自己,并想知道如何解决这个问题和类似的问题。给定整数X,如果P*P+q*q=X,则返回true
发布于 2020-06-05 16:43:46
最简单的方法是从输入数字X的0到平方根运行一个循环,对于每个循环检查sqrt(X ^2)是否为整数。如果存在整数,则返回true,否则返回false。
#include <math.h>
#include<iostream>
using namespace std;
int main () {
int n;
cin >> n;
for (int i = 0; i < sqrt(n); i++) {
if(floor(sqrt(n - i*i))==ceil(sqrt(n - i*i))){
cout << "true " << i << "^2 + " << sqrt(n - i*i) << "^2 = " << n << endl;
return 0;
} else {
continue;
}
}
cout << " Cant find two integers satifield a^2 + b^2 = n^2\n";
return 0;
}
这个算法很简单,但是随着输入的增加,运行起来似乎需要时间。
发布于 2020-06-05 17:01:02
你没有代码,所以我会告诉你面试官对你的期望:
只在你指出P和Q是任何整数的注释中,这应该是问题的一部分,如果不是,您应该与interviewer
。
发布于 2020-06-05 17:04:51
有一个定理,叫做两个平方定理之和,它说:
,一个大于1的整数可以写成两个平方的和当且仅当它的素数分解不包含升到奇数幂的3模4的素数同余。
也许你应该知道这件事。
这种检查是可行的。它需要分解X,这是一个众所周知的困难问题,但它只适合于较大的数字。如果X是一个64位数,那么您可以很容易地使用Pollard的Rho算法对其进行因子分析,这并不是很复杂。
https://stackoverflow.com/questions/62219987
复制相似问题