求解 Java 中的多项式方程
Solve a polynomial equation in Java
我有一个等式。
a4 + b4 = c4 + d 4
变量a、b、c和d可以取0到1000之间的任何值。编写一个程序,打印出满足上述等式的所有可能的a、b和c、d对。
我尝试使用 Java 来做到这一点。
我尝试的一种方法是构建一个包含键值对的映射:<0,04>, <1,14>, <2,24>....<1000,10004>。构建地图后,我希望遍历值列表并查看列表中两个元素的总和是否与列表中其他两个元素的总和相匹配。我被困在这一点上。
public static void getMatchingPairs()
{
long a;
long b;
long c;
long d;
Map<Integer,Long> map = new HashMap<Integer, Long>();
for(int i = 0; i < 1001; i++)
{
long res = Double.valueOf(Math.pow(i, 4)).longValue();
map.put(i,res);
}
List<Long> lst = (List<Long>) map.values();
}
不要使用double
数学来计算4的次方。只需乘以3次,即计算a*a*a*a + b*b*b*b
。
然后将结果的 Map
创建到用于计算结果的对的 List
:Map<Long, List<int[]>>
其中 int[]
是两个值的数组, 即 "pair".
例如,(1,2)
对产生值 17
,反向对 (2,1)
也是如此。由于这些是唯一具有该结果的对,因此您的地图将包括 17 = [(1,2), (2,1)]
.
不确定 "print all possible pairs of a, b and c, d" 是什么意思。简单的答案就是那 2 对(结果 17
)。
更复杂的答案是您需要打印每对组合,因为每对可以是 (a,b)
对或 (c,d)
对,因此您创建所有对组合:(1,2),(1,2)
、(1,2),(2,1)
、(2,1),(1,2)
和 (2,1),(2,1)
。
这一切看起来都很多余,因为对于每个 (a,b)
对 a != b
,将有 4 种组合,所以也许您只需要打印一对的结果(而不是对的组合) ,并且仅当 a <= b
时,因为 a > b
是多余的。
无论如何,您需要打印地图中的所有值列表以获得完整答案。
除了 Andres 的评论外,使用 LongStream 是一种更自然的解决方案。
让我们假设 a^4 + b^4 = b^4 + a^4 不是一个有趣的解决方案,所以你想要找到的是当 a <= b and c and d != a or b
Map<Long, List<long[]>> sums = LongStream.range(0, 1001)
.boxed()
.flatMap(a -> LongStream.range(a, 1001)
.boxed()
.map(b -> new long[]{a, b, a * a * a * a + b * b * b * b}))
.collect(Collectors.groupingBy(triple -> triple[2]));
sums.entrySet().stream()
.filter(e -> e.getValue().size() > 1)
.forEach(e -> System.out.println(
e.getValue().stream()
.map(t -> "(" + t[0] + "," + t[1] + ")")
.collect(Collectors.joining(", "))));
我在这里包含了您感兴趣的代码,因为您还不会期望为您的家庭作业编写此代码。
我有一个等式。
a4 + b4 = c4 + d 4
变量a、b、c和d可以取0到1000之间的任何值。编写一个程序,打印出满足上述等式的所有可能的a、b和c、d对。
我尝试使用 Java 来做到这一点。
我尝试的一种方法是构建一个包含键值对的映射:<0,04>, <1,14>, <2,24>....<1000,10004>。构建地图后,我希望遍历值列表并查看列表中两个元素的总和是否与列表中其他两个元素的总和相匹配。我被困在这一点上。
public static void getMatchingPairs()
{
long a;
long b;
long c;
long d;
Map<Integer,Long> map = new HashMap<Integer, Long>();
for(int i = 0; i < 1001; i++)
{
long res = Double.valueOf(Math.pow(i, 4)).longValue();
map.put(i,res);
}
List<Long> lst = (List<Long>) map.values();
}
不要使用double
数学来计算4的次方。只需乘以3次,即计算a*a*a*a + b*b*b*b
。
然后将结果的 Map
创建到用于计算结果的对的 List
:Map<Long, List<int[]>>
其中 int[]
是两个值的数组, 即 "pair".
例如,(1,2)
对产生值 17
,反向对 (2,1)
也是如此。由于这些是唯一具有该结果的对,因此您的地图将包括 17 = [(1,2), (2,1)]
.
不确定 "print all possible pairs of a, b and c, d" 是什么意思。简单的答案就是那 2 对(结果 17
)。
更复杂的答案是您需要打印每对组合,因为每对可以是 (a,b)
对或 (c,d)
对,因此您创建所有对组合:(1,2),(1,2)
、(1,2),(2,1)
、(2,1),(1,2)
和 (2,1),(2,1)
。
这一切看起来都很多余,因为对于每个 (a,b)
对 a != b
,将有 4 种组合,所以也许您只需要打印一对的结果(而不是对的组合) ,并且仅当 a <= b
时,因为 a > b
是多余的。
无论如何,您需要打印地图中的所有值列表以获得完整答案。
除了 Andres 的评论外,使用 LongStream 是一种更自然的解决方案。
让我们假设 a^4 + b^4 = b^4 + a^4 不是一个有趣的解决方案,所以你想要找到的是当 a <= b and c and d != a or b
Map<Long, List<long[]>> sums = LongStream.range(0, 1001)
.boxed()
.flatMap(a -> LongStream.range(a, 1001)
.boxed()
.map(b -> new long[]{a, b, a * a * a * a + b * b * b * b}))
.collect(Collectors.groupingBy(triple -> triple[2]));
sums.entrySet().stream()
.filter(e -> e.getValue().size() > 1)
.forEach(e -> System.out.println(
e.getValue().stream()
.map(t -> "(" + t[0] + "," + t[1] + ")")
.collect(Collectors.joining(", "))));
我在这里包含了您感兴趣的代码,因为您还不会期望为您的家庭作业编写此代码。