Why is this java elegant pairing method not giving correct result?

时间:2019-04-17 00:42:38

标签: java algorithm function math

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);
   }

}

1 个答案:

答案 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

z = a * a + x

x = z - (a * a)

,我们有(x,y)是(b,z-(a * a)) 该公式是x b的取消配对函数,但在取消配对函数中切换了变量a和b除外。

当x = y怎么办? 根据取消配对函数,使用更复杂的取消配对公式,该公式对应于x> y和a> b。

因此,根据取消配对函数,x> y的原始公式与x = y相同。这意味着原始的配对功能应为: x> = y? x * x + x + y:y * y + x;