【问题标题】:Solve a polynomial equation in Java在 Java 中求解多项式方程
【发布时间】:2018-09-20 15:07:24
【问题描述】:

我有一个方程式。

a4 + b4 = c4 + d4

变量 a、b、c 和 d 可以取 0 到 1000 之间的任何值。编写一个程序,打印满足上述等式的所有可能的 a、b 和 c、d 对。

我尝试使用 Java 来实现。

我尝试的一种方法是构建一个包含键值对的映射:4>、4>、4>....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();
    }

【问题讨论】:

  • 成对订购了吗?例如。 (1,2),(1,2)(1,2),(2,1)(2,1),(1,2)(2,1),(2,1) 是否不同?那是 1 个还是 4 个“可能的对”?
  • 在我看来这不是一个等式。例如 10 = 10 => 7+3 = 2+8 |那么你只需得到基于 4 或每个数字的日志。
  • @Andreas 这些是 4 对有效的对。
  • @Juan 值是 0 到 1000 之间的整数。当然,“整数”部分没有说明,但否则没有任何意义,否则会有无限的解决方案。
  • 好的:日志基数为 4 或数字必须是 0 到 1000 之间的整数。

标签: java collections polynomial-math


【解决方案1】:

除了 Andres 的 cmets,使用 LongStream 是一种更自然的解决方案。

让我们假设 a^4 + b^4 = b^4 + a^4 不是一个有趣的解决方案,所以你想要找到的是当 a

    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(", "))));

我已将代码包含在此处以供您感兴趣,因为您还不会期望为您的家庭作业编写此代码。

【讨论】:

  • 标题说Java,但如果有人感兴趣,我有我认为是Python中更简单的解决方案。
【解决方案2】:

不要使用 double 数学来计算 4 的幂。只需乘以 3,即计算 a*a*a*a + b*b*b*b

然后将结果的Map 创建为用于计算结果的对的ListMap&lt;Long, List&lt;int[]&gt;&gt; 其中int[] 是两个值的数组,即“对”。

例如,(1,2) 对产生值 17,反向对 (2,1) 也是如此。由于这些是唯一具有该结果的对,因此您的地图将包括 17 = [(1,2), (2,1)]

不确定 “打印所有可能的 a、b 和 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 个组合,所以也许您只需要打印一对(而不是对的组合)的结果,并且仅当@987654340 @,因为a &gt; b 是多余的。

无论如何,您需要从地图中的所有值列表中打印以获得完整答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多