有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

算法为什么这个java优雅的配对方法不能给出正确的结果?

我用优雅的配对将两个数字配对,形成一个唯一的数字。但当我配对两个相同的数字时,例如“配对(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);
   }

}

共 (1) 个答案

  1. # 1 楼答案

    Carcigenicate是对的

    对于pair函数,它取两个数(比如a)中的最大值,并使用(1)z=a*a+a+b或(2)z=a*a+b,其中b是x和y的较小数,生成一个大于(a)平方且小于(a+1)平方的数

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

    所以当你解配对时,取z的平方根总是得到a,原来两个数中较大的一个

    假设x>;y、 然后原始数字中较大的一个是x,因此a=x,b=y,a>;B 然后我们使用了一级方程式

    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>;=Yx*x+x+y:y*y+x