LINUX.ORG.RU
ФорумTalks

Квиз (не пользоваться гуглом)


0

1

Задачка старая и известная, просто интересно посмотреть, сколько людей на нее сейчас тут сходу ответят. Вот она:

Пусть есть две переменные, скажем

int a = 10, b = 5;
Поменять их значения местами, не создавая новую переменную.

Deleted

Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Deleted

дабы не смущать читающих и дать им самим вспомнить

Deleted
()

читерство

int swap(int& a, int& b, int b2) { b=a; a=b2;}
swap(a,b,b)
Dragon59 ★★
()

a = a+ b; b = a - b; a = a - b;

Nagwal ★★★★
()

Для числовых несложно, если игнорировать ошибки округления.

a = a - b; // a = a0-b0, b = b0

b = b - a; // a = a0-b0, b = 2*b0-a

a = a + b; // a = b0, b = 2*b0-a0

b = 2*a - b; // a = b0, b = a0

zhuravlik ★★★★
()
Последнее исправление: zhuravlik (всего исправлений: 1)

int a = 10, b = 5;

Поменять их значения местами, не создавая новую переменную с данными.

принимая данное условие

int *pa = &a;
int *pb = &b;
int *tmp = pa;
pa = pb;
pb = tmp;
это куда быстрее вашего XOR'а, и работает с любым типом данных.

drBatty ★★
()
a := a + b;
b := a - b;
a := a - b;

a := a * b;
b := a / b;
a := a / b;

С XOR не помню, потому что не помню как оно работает (два выше можно легко придумать заново).

KivApple ★★★★★
()
Ответ на: комментарий от Deleted

значения переменных а и б остались теми же, так что всё таки забыл.

nanoolinux ★★★★
()
Ответ на: комментарий от Deleted

Да это понятно. Вообще самый оптимальный вариант - использовать XOR. И по скорости и по надёжности. Я просто для полноты набора способов (честных, а не читерских как с указателями, swap и xchg) привёл.

KivApple ★★★★★
()

Мы такие задачки в школе на паскале решали.

mono ★★★★★
()
Ответ на: комментарий от AptGet

значения переменных (на которые указывают указатели) тоже поменялись.

drBatty ★★
()
Ответ на: комментарий от KivApple
a := a * b;
b := a / b;
a := a / b;

С XOR не помню, потому что не помню как оно работает (два выше можно легко придумать заново).

точно также. Разница в том, что XOR обратная операция к самой себе.

drBatty ★★
()
Ответ на: комментарий от drBatty

Тогда лучше так

template <class T> void swap(T &a, T &b) {
    T tmp = a; a = b; b = tmp;
}

template <int> void swap(int &a, int &b) {
    a ^= b; b ^= a; a ^= b;
}
...

Deleted
()
Ответ на: комментарий от Deleted

template <class T> void swap(T &a, T &b) { T tmp = a; a = b; b = tmp;

ага. И потом ломать голову, что там (не)определено в конструкторе копирования и operator=()...

drBatty ★★
()
Ответ на: комментарий от Deleted

Два выше хороши, правда, если a - 32-битное целое, и при этом a = 0x7ffffffe, то может случиться фейл.

Ты уж определись, 10 или 0x7ffffffe

zolden ★★★★★
()
Ответ на: комментарий от drBatty

Я никогда не буду использовать в своей работе классы, в которых не определен/не заблокирован конструктор копирования. А оператор =() необязателен для корректной работы (он нужен для оптимизаций).

Deleted
()

a=a+b;
b=a-b;
a=a-b;

Вроде так...

deterok ★★★★★
()

Поменять их значения местами, не создавая новую переменную

Хардварные решения:
Перепаять 2 микросхемы ППЗУ.
Переключить разъёмы 2 дисковых накопителей.
Переставить на столе 2 ноута.
... :)

quickquest ★★★★★
()
Ответ на: комментарий от Deleted

Я никогда не буду использовать в своей работе классы, в которых не определен/не заблокирован конструктор копирования. А оператор =() необязателен для корректной работы (он нужен для оптимизаций).

дык в данном примере используется и конструктор копирования, и оператор operator=(T &). Потому, как этот шаблон сработает - совершенно не ясно. Если вообще сработает.

drBatty ★★
()
Ответ на: комментарий от drBatty

Если оператор =() не переопределен руками, он должен вызывать конструктор копирования, создавать новый объект, являющийся копией присваиваемого, а затем помещать его в память на место того, который стоит в присваивании слева.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.