算法为什么这个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 楼答案
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 然后我们使用了一级方程式
及
我们有(x,y)是(a,z-(a*a)-a) 该公式是x>;y和a>;b
假设x<;y、 然后原始数字中较大的是y,因此a=y,b=x和b<;A. 然后我们使用公式2
及
我们有(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