Два положительных целых числа «a» и «b» имеют сумму «s» и побитовое XOR для «x». Сколько возможных значений может быть у упорядоченной пары (a, b)?

Нам нужно найти упорядоченные пары (a,b).

(2‹=s‹=10^12) и (0‹=x‹=10^12)

Например -

s=9 x=5 Количество упорядоченных пар = 4{(2,7),(7,2)(3,6)(6,3)}

Может кто-нибудь, пожалуйста, дайте мне способ решить этот вопрос !!!


person user3111412    schedule 27.03.2016    source источник
comment
Обратите внимание, что a + b = 2 * (a & b) + (a ^ b) = 2 * (a | b) - (a ^ b), по определению вычислений суммы битов и битов переноса при целочисленном сложении.   -  person njuffa    schedule 27.03.2016
comment
Вопрос конкурса (перекрестная ссылка)   -  person njuffa    schedule 27.03.2016
comment
Спасибо @njuffaa, на самом деле я знаю это определение. Я застрял после этого. Если вы знаете, как решить, можете ли вы объяснить шаги.   -  person user3111412    schedule 28.03.2016
comment
Возможный дубликат данного XOR и SUM двух чисел . Как найти числа?   -  person Spektre    schedule 29.03.2016


Ответы (1)


Вот логика пусть числа будут а и б мы знаем

s = a + b
x = a ^ b

следовательно

x = (s-b) ^ b

Поскольку мы знаем x и знаем s, поэтому для всех целых чисел, идущих от 0 до s, просто проверьте, выполняется ли это последнее уравнение

вот код для этого

public List<Pair<Integer>> pairs(int s, int x) {
    List<Pair<Integer>> pairs = new ArrayList<Pair<Integer>>();
    for (int i = 0; i <= s / 2; i++) {
        int calc = (s - i) ^ i;
        if (calc == x) {
            pairs.add(new Pair<Integer>(i, s - i));
            pairs.add(new Pair<Integer>(s - i, i));
        }
    }
    return pairs;
}

Пара классов определяется как

class Pair<T> {
    T a;
    T b;

    public String toString() {
        return a.toString() + "," + b.toString();
    }

    public Pair(T a, T b) {
        this.a = a;
        this.b = b;
    }
}

Код для проверки этого:

public static void main(String[] args) {
    List<Pair<Integer>> pairs = new Test().pairs(9,5);
    for (Pair<Integer> p : pairs) {
        System.out.println(p);
    }
}

Выход:

2,7
7,2
3,6
6,3
person abhaybhatia    schedule 29.03.2016
comment
Спасибо, @abhaybhatia, но не думаете ли вы, что потребуется много времени, когда «s» будет равно 10 ^ 12. Поскольку мы запускаем весь цикл от 1 до s/2. - person user3111412; 31.03.2016