如何在知道三个信息的情况下获得三个数字的值
how to get value of three numbers knowing three information
我正在尝试解决一个问题,我需要知道一些信息来获取三个未知数 (x,y,z) 的值。它们的总和等于 70
、x^2 + y^2 = z^2
和 x < y < z
。
答案应该是x = 20, y = 21, z = 29
我试图用三个未知数的两个方程来求解它,但我失败了。获得解决方案的任何提示?我想找到一种算法或方程来构建解决此问题的 java 代码
我假设 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
意味着您的解决方案具有 "small" 个值。
所以在您的代码中,改变三个参数 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
相矛盾。所以我的算法不需要改变。
扩展 ,采用 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。
这使得问题更容易暴力破解。
我已经解决了这个问题,我要感谢所有帮助过我的人。
这是我解决问题的代码
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; }}
我正在尝试解决一个问题,我需要知道一些信息来获取三个未知数 (x,y,z) 的值。它们的总和等于 70
、x^2 + y^2 = z^2
和 x < y < z
。
答案应该是x = 20, y = 21, z = 29
我试图用三个未知数的两个方程来求解它,但我失败了。获得解决方案的任何提示?我想找到一种算法或方程来构建解决此问题的 java 代码
我假设 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
意味着您的解决方案具有 "small" 个值。
所以在您的代码中,改变三个参数 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
相矛盾。所以我的算法不需要改变。
扩展 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。
这使得问题更容易暴力破解。
我已经解决了这个问题,我要感谢所有帮助过我的人。
这是我解决问题的代码
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; }}