Почему этот элегантный метод сопряжения Java не дает правильного результата? - PullRequest
2 голосов
/ 17 апреля 2019

Я соединяю два числа, чтобы сформировать уникальное число, используя элегантное соединение. Но когда я соединяю два одинаковых числа, например «пара (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 Ответ

2 голосов
/ 17 апреля 2019

Карцигеникат прав.

Для парной функции она берет наибольшее из двух чисел (скажем, а) и производит число, которое больше (а) в квадрате и меньше (а + 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

и у нас (х, у) есть (а, z - (а * а) - а) Эта формула является функцией несопряжения для x> y и a> b.

Предположим, x

z = a * a + x

и

x = z - (a * a)

и у нас (х, у) есть (б, г - (а * а)) Эта формула является функцией несопряжения для x b, за исключением случаев, когда переменные a и b включены в функцию расщепления.

А как насчет того, когда х = у? В соответствии с функцией неспаривания используется более сложная формула несопаривания, которая соответствует x> y и a> b.

Таким образом, исходная формула для x> y одинакова для x = y, в соответствии с функцией неспаривания Это означает, что оригинальная функция сопряжения должна быть: х> = у? х * х + х + у: у * у + х;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...