代码之家  ›  专栏  ›  技术社区  ›  Andulos

用Java求解多项式方程

  •  0
  • Andulos  · 技术社区  · 8 年前

    我有一个方程式。

    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. ><10001000 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();
        }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Andreas dfa    8 年前

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

    然后创建 Map 结果的 List 用于计算结果的对中: Map<Long, List<int[]>> 其中 int[] 是两个值的数组,即“对”。

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

    不确定什么 “打印所有可能的a、b和c、d对” 方法简单的答案就是这两对(对于结果 17 )。

    更复杂的答案是,您需要打印每一对的组合,因为每一对都可以是 (a,b) 配对或a (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 是多余的。

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

        2
  •  1
  •   Peter Lawrey    8 年前

    除了Andres的评论之外,使用LongStream是一种更自然的解决方案。

    假设a^4+b^4=b^4+a^4不是一个有趣的解决方案,那么您想找到的是当a<=b、c和d!=a或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(", "))));
    

    我把代码放在这里是为了让你感兴趣,因为你还没准备好为你的家庭作业写这篇文章。