我正在尝试解决一个问题,我需要知道一些信息才能获得三个未知数(x,y,z)的值。它们的总和等于70
,x^2 + y^2 = z^2
和x < y < z
。
答案应为x = 20, y = 21, z = 29
我尝试将其解决为三个未知数中的两个方程但我失败了。获得解决方案的任何提示?我想找到一个算法或方程来构建解决这个问题的java代码
答案 0 :(得分:1)
我假设x,y和z必须是正整数,因为删除整数限制允许无限多个解。这是一个算法 - 我会把代码留给你。
您的第二个等式x^2 + y^2 = z^2
表示x,y和z构成Pythagorean triple。该等式的所有解都具有
x = k(m^2 - n^2), y = 2kmn, z = k(m^2 + n^2)
(可能有x和y交换)其中m,n和k是正整数,m > n
,m和n中的一个是偶数,另一个是奇数,而(m,n)是相对素数。你可以放弃对m和n的最后两个限制,这是为了使三元组具有唯一的表示。
你的第三个限制x < y < z
只是从三个值中得到一个独特的三元组。重要的是,您的第一个限制x + y + z = 70
意味着您的解决方案具有“小”值。
因此,在您的代码中,改变三个参数k,m和n。只有有限数量的值允许x,y和z之和小于或等于70,这对k,m和n设置了限制。找到相等的x,y和z之和为70.你可以通过不让m和n都是偶数或两者都是奇数来减少一半的试验数。您还可以通过仅改变m和n并计算k应该是什么来避免显式改变k,因为x,y,z中的每一个都与k成比例变化,并且只接受整数k。
这有点像蛮力解决方案,但它很容易编程,并且比仅尝试x,y和z的所有值更快。
编辑:我现在看到x,y和z也可能为零。从理论上讲,这意味着你需要测试x = 0
,但从那以后y^2 = z^2
显然不可能与y < z
相矛盾。所以我的算法不需要改变。
答案 1 :(得分:1)
展开@RoryDaulton's answer,抓取x = k(m^2 - n^2)
,y = 2kmn
和z = k(m^2 + n^2)
并应用和约束为我们提供
2*k*m*(m + n) = 70
或者
k * m * (m + n) = 35 = 7 * 5 = 35 * 1
需要注意的重要一点是,上述RHS只有两个独特因素; LHS有三。因此, LHS的至少一个因子(k
,m
,m + n
)必须为1。
由于m
和n
是唯一的正整数,m + n
总是大于1.因此,
k = 1 or m = 1
其余LHS因子的唯一可能值是7和5 或 35和1.
这使问题更容易暴力。
答案 2 :(得分:0)
我已经解决了这个问题,我要感谢所有帮助过我的人。
这是我解决问题的代码
int x,y,z;
long mul=0;
for(int n=1;n<=sum;n++){
for (int m=2;m<=sum;m++){
x= (int) ((Math.pow(m,2)) - (Math.pow(n,2)));
y= 2*m*n;
z= (int) ((Math.pow(m,2)) + (Math.pow(n,2)));
if(x+y+z == sum){
mul = x*z*y;
}
}}
return mul; }}