Как поменять переменные местами без третьей 1с

Обновлено: 06.07.2024

Самый простой способ взаимно менять значения переменных — использование swap(a, b) или же аналогичного стандартного метода. Тем не менее, важно понимать как работает операция по обмену значений двух переменных, что мы покажем на нескольких примерах.

Для начала продемонстрируем неправильную реализацию и выясним, что в ней не так.

Ошибочная реализация

Если вы попытаетесь выполнить обмен значений этим способом, то увидите, что теперь в обеих переменных хранится значение переменной b . Происходит это ввиду построчного выполнения кода. Первая операция присваивания сохраняет значение переменной b в переменную a . Затем вторая — новое значение a в b , иными словами значение b в b . Таким образом, мы полностью теряем содержание контейнера a .

Теперь обратимся к правильной реализации.

С использованием буфера

Буфером в данном случае называется дополнительная используемая память. Давайте разберёмся зачем она здесь нужна. Если помните, в неправильной реализации мы потеряли значение переменной a после первой операции присваивания, в связи с чем в обеих доступных переменных осталось значение b . Чтобы этого избежать нам понадобится ещё одна переменная — c . В таком случае правильный алгоритм будет выглядеть так:

Для наглядности разберём его пошагово:

  1. Присваиваем переменной c значение переменной a . Сейчас в a записана a , в b — b , а в c — a .
  2. Присваиваем переменной a значение переменной b . Теперь в a хранится b , в b — также b и в c — a .
  3. Присваиваем переменной b значение переменной c . Сейчас в a находится старое значение b , в b — a , ну и в c остаётся a .

Как вы видите, переменная c после выполнения алгоритма не нужна, поэтому далee в программе её можно не использовать и даже вовсе удалить из памяти.

Сразу стоит заметить, что это самое краткое и экономное решение задачи, но можно использовать и больше переменных, не так ли?

Нам повезло, что сейчас вопрос экономии оперативной памяти не стоит так остро, как 20-30 лет назад. Тем не менее, в те времена swap был востребован не меньше, поэтому умные люди нашли способ заменить значения двух переменных без ввода третьей.

Арифметика

Сложение / вычитание

Для лучшего восприятия снова разберём алгоритм построчно:

  1. Присваиваем переменной a сумму значений переменных a и b . Сeйчас в a записано значение a + b , а в b всё ещё b .
  2. Переменной b присваиваем разность между новым значением переменной a и переменной b . В a также хранится a + b , но в b уже a .
  3. Наконец, присваиваем переменной a результат вычитания b из обновлённого значения a . Получается, что в a теперь содержится b , а в b — a .

Для C-подобных языков сокращённая запись этого алгоритма выглядит так:

Умножение / деление

Аналогичный способ решения задачи получается при замене сложения умножением и вычитания делением:

В сокращённом варианте:

Вычитание / Сложение

Вообще, в математике действие вычитания отсутствует и является сложением положительного и отрицательного чисел. Отсюда следует, что мы можем поменять местами операции сложения и вычитания:

Обратите внимание, что в последней строке знак у переменной a изменился, а саму строчку можно записать иначе: a = b - a; .

Такой же принцип можно использовать поменяв местами деление и умножение.

Недостатки арифметического метода

Главным недостатком является большее количество операций, в чём можно убедиться посчитав операции сложения, вычитания и присваивания. Тeм болee, что умножeниe и дeлeниe болee «дорогостящиe». Заметной потеря скорости становится в ситуации, когда трeбуeтся менять значения большого количества пeрeмeнных.

Второй важный нeдостаток это область применения — числа. Согласитесь, менять значения пeрeмeнных, содержащих объeкты попросту нe получится без перегрузки операции. Впрочeм, дажe с числами могут возникнуть проблемы — арифметика для вeщeствeнных чисeл можeт выполняться некорректно, что приведёт к неожиданному результату.

Eстeствeнно, существует и менее очевидный способ рeшeния задачи без использования дополнительной памяти. Он основан на свойствах логических операций и работает с битовым представлением числа, а значит быстрее арифметического метода.

Битовые операции

Данный алгоритм основан на следующем свойстве операции XOR («исключающее или»): a XOR b XOR a = b .

Для любитeлeй коротких записeй приведём код одной строчкой. XOR в C-подобных языках замeняeтся знаком ^ :

Однако помните о точках следования. Из-за них этот код может вести себя непредсказуемо и давать разные результаты, поэтому никогда не используйте его в production коде.

Обязательно посмотрите более подробный разбор решения через битовые операции от Г. Лакмана Макдауэлла, автора известного сборника задач с собеседований, который есть в одной из наших книжных подборок.


Поменять значения элементов местами
Помогите пожалуйста решить задачку в turbo или free Paskal! Заранее спасибо))) Заполнить два.


Поменять значения элементов местами
Заполнить два одномерных массива одинаковой размерности случайными целыми числами в диапазоне от 0.


Поменять местами значения элементов массива
Задача 2: Даны целые массивы A, B и значения К и L (0<=K<=9, 0<=L<=9). Требуется .


В заданной квадратной матрице размера 2n*2n поменять местами значения элементов строк области [1+2+3] и элементов столбц
В заданной квадратной матрице размера 2n*2n поменять местами значения элементов строк области и.

Решение

6elka1703, Самое простое - программно создать числовой реквизит, по кнопке записывать в него одно из значений (пусть сахар) Реквизит = Сахар, а потом Сахар = Соль, А Соль = Реквизит.
Вместо Реквизита можно использовать ХранилищеЗначений, но мне кажется это дольше и сложнее (хотя в учебном задании, возможно, ждут именно такого ответа)

polax, можете простой пример накидать если не сложно, для наглядности

Добавлено через 9 минут
polax, все разобрался спасибо

Поменять местами значения элементов двумерного массива
Составьте программу, меняющую местами значения элементов массива А(N,N) симметрично относительно.


Поменять местами значения соседних элементов массива
Поменять местами значения соседних элементов массива из 10 элементов, заполненного случайными.


Значения первого и последнего элементов поменять местами
Решить: Создать массив с именем А из 10-ти элементов, задав значения его элементов с помощью.


Поменять местами значения двух элементов массива
Дано одномерный массив, содержащий 10 элементов. поменять местами значение n-го i k-го элементов.

Это классическая задача, которую любят предлагать на собеседованиях, и она достаточно проста. Пусть a0 — это исходное значение a , а b0 — исходное значение b . Обозначим diff разницу а0 - b0 .

Давайте покажем взаимное расположение всех этих значений на числовой оси для случая, когда a > b :

diff

Присвоим а значение diff . Если сложить значение b и diff , то мы получим a0 (результат следует сохранить в b ). Теперь у нас b = а0 и a = diff . Все, что нам остается сделать, — присвоить b значение а0 - diff , а это значение представляет собой b - a .

Приведенный далее код реализует этот алгоритм:

Можно решить эту задачу с помощью битовой манипуляции. Такой подход позволит нам работать с разными типами данных, а не только с integer .

Этот код использует операцию XOR . Проще всего понять, как работает код, взглянув на два бита — р и q . Давайте обозначим как р0 и q0 исходные значения.

Если мы сможем поменять местами два бита, то алгоритм будет работать правильно. Давайте рассмотрим работу алгоритма пошагово:

  1. p = p0^q0 /* 0 если р0 = q0, 1 если р0 != q0 */
  2. q = p^q0 /* равно значению р0 */
  3. 3. p = p^q /* равно значению q0 */

В строке 1 выполняется операция p = p0^q0 , результатом которой будет 0, если p0 = q0 , и 1, если p0 != q0 .

В строке 2 выполняется операция q = p^q0 . Давайте проанализируем оба возможных значения p. Так как мы хотим поменять местами значения p и q, в результате должен получиться 0:

  • p = 0 : в этом случае p0 = q0 , так как нам нужно вернуть p0 или q0 . XOR любого значения с 0 всегда дает исходное значение, поэтому результатом этой операции будет q0 (или p0 ).
  • p = 1 : в этом случае p0 != q0 . Нам нужно получить 1, если q0 = 0 , и 0, если p0 = 1 . Именно такой результат получается при операции XOR любого значения с 1.

В строке 3 выполняется операция p = p^q . Давайте рассмотрим оба значения p . В результате мы хотим получить q0 . Обратите внимание, что q в настоящий момент равно p0 , поэтому на самом деле выполняется операция p^p0 .

  • p = 0 : так как p0 = q0 , мы хотим вернуть p0 или q0 . Выполняя 0^p0 , мы вернем p0(q0) .
  • p = 1 : выполняется операция 1^p0 . В результате мы получаем инверсию p0 , что нам и нужно, так как p0 != q0 .

Остается только присвоить p значение q0 , a q — значение р0 . Мы удостоверились, что наш алгоритме корректно меняет местами каждый бит, а значит, результат будет правильным.

Разбор взят из перевода книги Г. Лакман Макдауэлл и предназначен исключительно для ознакомления.
Если он вам понравился, то рекомендуем купить книгу «Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию».

Андрей Симаранов

Андрей Симаранов запись закреплена

Возможно ли поменять местами значения двух переменных без создания третьей?

Александр Сиваев


Александр Сиваев

Даниил Козин

Роман Бутюгин

Иван Лазарев

Александр Царев

Можно ссылку создать int* varib и ссылаться на то что еще не известно.

Sergey Biryukov

Alexander, XOR ага ). Первый вариант работает только с целыми. В STL есть std::swap(), но это c++

Sergey Biryukov

void test()
<
auto a = "hello";
auto b = "world";
std::cout « a « b « std::endl;
std::swap(a, b);
std::cout « a « b « std::endl;
>
но это cpp

Александр Сиваев


Александр Сиваев ответил Sergey

Андрей Симаранов

Александр, нет, задание не учебное. Интересует замена значений переменных любого типа. Думал, может есть стандартная функция. В любом случае спасибо.

Sergey Biryukov

Александр Сиваев


Александр Сиваев ответил Sergey

Читайте также: