我使用优雅的配对方式将两个数字配对形成一个唯一的数字。但是当我将两个相同的数字配对时,例如“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/