I'm pairing two numbers to form a unique number using elegant pairing. But when I pair two same numbers e.g "pair(12,12)" it gives me 156. When I want to unpair it, it's going to give me (0,12). I then tried to pair (0,12), it gives me 156 also. All other numbers work gives a unique number, I can pair and unpair them unless I pair the same number; (10,10),(9,9), etc.
Where did I go wrong please?
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);
}
}
答案 0 :(得分:2)
致癌物是正确的
对于对函数,它使用两个公式之一来求出两个数字中的最大值(例如a),并产生一个大于(a)平方且小于(a + 1)平方的数字。 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 和 ,我们有(x,y)是(b,z-(a * a))
该公式是x 当x = y怎么办?
根据取消配对函数,使用更复杂的取消配对公式,该公式对应于x> y和a> b。 因此,根据取消配对函数,x> y的原始公式与x = y相同。这意味着原始的配对功能应为:
x> = y? x * x + x + y:y * y + x; z = a * a + x
x = z - (a * a)