java - 为什么这个java优雅的配对方法没有给出正确的结果?

标签 java algorithm function math

我使用优雅的配对方式将两个数字配对形成一个唯一的数字。但是当我将两个相同的数字配对时,例如“pair(12,12)”,它会给我 156。当我想取消配对时,它会给我 (0,12)。 然后我尝试配对 (0,12),它也给了我 156。 所有其他号码都会给出一个唯一的号码,我可以对它们进行配对和取消配对,除非我配对相同的号码; (10,10),(9,9) 等

请问我哪里出错了?

public class elegantPairing {

    /**
    * @param x
    * @param y
    * @return 
    */
   public static int pair(int x, int y) {
    return x > y ? x * x + x + y : y * y + x;
   }

   public static int[] unpair(int z) {
       int b = (int) Math.sqrt(z);
       int a = z - b * b;
       return a < b ? new int[]{a, b} : new int[]{b, a - b};
   }
   public static void main(String[] args) throws IOException {
    int firstValue = unpair(110)[0];
        int secondValue = unpair(110)[1];
        int paired=pair(10,10);
        System.out.println(firstValue+"     "+secondValue+"     Paired       "+paired);
   }

}

最佳答案

Carcigenicate 是对的。

对于pair函数,它采用两个数字中最大的一个(比如a),并使用两个公式之一(( 1) z = a * a + a + b 或 (2) z = a * a + b,其中b是x和y中较小的数。

您可以检查任一公式给出的数字 z 是否大于 (a) 的平方且小于 (a + 1) 的平方。

因此,当您取消配对时,对 z 求平方根总是会得到 a,即原始两个数字中较大的一个。

假设 x > y。那么原始数中较大的一个是x,所以a = x 且b = y,并且a > b。 然后我们用公式1,

z = a * a + a + y

y = z - (a * a) - a

我们有 (x, y) 是 (a, z - (a * a) - a) 该公式是 x > y 和 a > b 的取消配对函数。

假设 x < y。那么原始数中较大的一个是 y,因此 a = y,b = x 且 b < a。 然后我们使用公式2,

z = a * a + x

x = z - (a * a)

我们有 (x, y) 是 (b, z - (a * a)) 该公式是 x < y 和 a > b 的解配对函数,除了在解配对函数中交换了变量 a 和 b 之外。

当 x = y 时呢? 根据解配对函数,使用更复杂的解配对公式,对应于x>y且a>b。

因此,根据解配对函数,x > y 的原始公式与 x = y 相同。这意味着原来的配对函数应该是: x >= y ? x * x + x + y : y * y + x;

关于java - 为什么这个java优雅的配对方法没有给出正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55718366/

相关文章:

javascript - 将 OOP 类转换为 FP 函数的最佳方法是什么?

JavaScript 函数,将 HTML 作为参数传递

java - Rx java 内存不足

用于 Oracle 访问的 Java 代码在执行期间失败。我该如何修复我的代码?

java - 为 DAG 构建全路径算法

c# - 从最后一个叶子到根反向迭代 TreeView 节点的算法

javascript - 对函数表达式和我将函数表达式分配给的 var 使用相同的标识符是否存在任何问题?

java - ArangoDB 在没有 new 的情况下创建/更新

java - HTTP 和套接字 :

algorithm - 相交线和点阵?