我有一个等式。
a 4 + b 4 = c 4 + d 4
变量a,b,c和d可以取0到1000之间的任何值。编写一个程序,打印满足上述等式的所有可能的a,b和c,d对。
我尝试使用Java来做到这一点。
我尝试的方法之一是构建包含键值对的映射:< 0,0 4 >,< 1,1 4 > ;,< 2,2 4 > ....< 1000,1000 4 >。构建映射后,我希望迭代值列表,看看列表中两个元素的总和是否与列表中其他两个元素的总和相匹配。我被困在这一点上。
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();
}
答案 0 :(得分:2)
不要使用double
数学来计算4的幂。只需乘以3次,即计算a*a*a*a + b*b*b*b
。
然后为用于计算结果的Map
对创建结果的List
:Map<Long, List<int[]>>
其中int[]
是两个值的数组,即a&#34;对&#34;。
例如,对(1,2)
会产生值17
,反向对(2,1)
也会产生值17 = [(1,2), (2,1)]
。由于这些是唯一具有该结果的对,因此您的地图将包含17
。
不确定&#34;打印所有可能的a,b和c对,d&#34; 表示。简单的答案就是那两对(结果(a,b)
)。
更复杂的答案是您需要打印每对组合,因为每对可以是(c,d)
对或(1,2),(1,2)
对,因此您可以创建所有对的组合:{{1} },(1,2),(2,1)
,(2,1),(1,2)
和(2,1),(2,1)
。
这一切看起来都非常多余,因为对于(a,b)
的每个a != b
对,会有4种组合,所以也许你只需打印一对的结果(不是对的组合),仅在a <= b
时,因为a > b
是多余的。
无论如何,您需要打印地图中的所有值列表以获得完整答案。
答案 1 :(得分:1)
除了Andres的评论之外,使用LongStream是一种更自然的解决方案。
让我们假设a ^ 4 + b ^ 4 = b ^ 4 + a ^ 4不是一个有趣的解决方案,所以你想要找到的是当&lt; = b和c和d!= a或b < / p>
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(", "))));
我已将这些代码包含在您的兴趣中,因为您不希望为此作业编写此代码。