Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/173: Рейтинг темы: голосов - 173, средняя оценка - 4.61
 Аватар для vitalikk
6 / 6 / 0
Регистрация: 11.01.2009
Сообщений: 14

Надо поменять значение переменных местами

16.01.2009, 12:44. Показов 36449. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим имеем две переменные А и В, переменные числовые, пусть будут целые числа.
Надо поменять значение переменных местами, если Это сделать через третью
переменныю С то это просто
С = А;
А = В;
В = С;

Попробуйте без третьей переменой, есть несколько вариантов:
Кстати получается тоже в три строчки
5
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.01.2009, 12:44
Ответы с готовыми решениями:

Поменять местами значение переменных
Задание: Поменять местами содержимое переменных А и В и высести новые значения А и В. Я сделал так: double firstA, firstB, secondA,...

Поменять значение переменных местами
Объявить две переменные типа byte и float, вывести на экран (сначала byte, затем float), поменять их значения местами,не используя...

Значение переменных поменять местами так, чтобы они оказались упорядоченными по возрастанию
Здравствуйте дорогие форумчане! помогите пожалуйта с решением задачки на С++ . Значение переменных X, Y, Z, поменять местами так, что бы...

48
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
16.01.2009, 20:33
Лучший ответ Сообщение было отмечено как решение

Решение

Забавно... раньше не задумывался. Получилось такое:
Code
1
2
3
A := A xor B;
B := B xor A;
A := A xor B;
5
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
16.01.2009, 20:38
Лучший ответ Сообщение было отмечено как решение

Решение

На языке Си
Code
1
 a= a+b - (b=a);
8
 Аватар для pascal65536
11 / 11 / 3
Регистрация: 26.09.2008
Сообщений: 77
16.01.2009, 22:12
Лучший ответ Сообщение было отмечено как решение

Решение

Code
1
2
3
A := A + B;
B := A;
A := A - B;
3
UNIX-way
 Аватар для Delphin_KKC
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
16.01.2009, 22:31
Интересный вопрос. Спасибо автору темы и всем ответившим. Особенно Гуманоиду. Ибо его решение мне видится наиболее оптимальным (во всяком случае - для целочисленных операций). В его решении исключена ошибка выхода за границы допустимого значения.
1
12 / 12 / 2
Регистрация: 27.09.2008
Сообщений: 43
20.01.2009, 14:41
Просто как факт, можно решить еще так:
Code
1
2
3
A := A * B;
B := A / B;
A := А / B;
Delphin_KKC, если верить Крису Касперски, то способ предложенный Гуманоидом проигрывает в эффективности способу с привлечением третьей переменной.
0
0 / 0 / 0
Регистрация: 16.01.2009
Сообщений: 8
20.01.2009, 16:41
swap(a,b);
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.01.2009, 17:11
Алгоритм, уже написанный Humanoid'ом в сокращенном варианте записи на С:
Code
1
a ^= b ^= a ^= b;
1
UNIX-way
 Аватар для Delphin_KKC
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
20.01.2009, 18:22
Цитата Сообщение от the_t_a Посмотреть сообщение
Просто как факт, можно решить еще так:
Code
1
2
3
A := A * B;
B := A / B;
A := А / B;
Delphin_KKC, если верить Крису Касперски, то способ предложенный Гуманоидом проигрывает в эффективности способу с привлечением третьей переменной.
Мож по эффективности в смысле скорости проигрывает. Зато выигрывает в смысле экономии памяти.
Что же касаемо твоего способа - вариант, конечно. Но операция деления выполняется с определённой точностью. Т.е. может иметь место некоторая ошибка. И, к томуж, операция деления - одна из самых медленных ассемблерных операций (эт что касаемо эффективности).
0
12 / 12 / 2
Регистрация: 27.09.2008
Сообщений: 43
20.01.2009, 19:41
Мож по эффективности в смысле скорости проигрывает. Зато выигрывает в смысле экономии памяти.
Это каждый программист решает для себя сам, что ему нужно в каждой конкретной ситуации: быстрый код или экономный. К тому же мне представляется, что такое "не стандартное" действие через неделю будет смотреться дико и непонятно. То есть придется останавливаться и вспоминать, что это значит.

Что же касаемо твоего способа - вариант, конечно. Но операция деления выполняется с определённой точностью. Т.е. может иметь место некоторая ошибка. И, к томуж, операция деления - одна из самых медленных ассемблерных операций (эт что касаемо эффективности).
Да я знаю, что вариант тормознутый. Однако в разделе "Алгоритмы" он существовать может вполне
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
20.01.2009, 21:22
Цитата Сообщение от Vourhey Посмотреть сообщение
Алгоритм, уже написанный Humanoid'ом в сокращенном варианте записи на С:
Code
1
a ^= b ^= a ^= b;
За такой код - отправлять в сад, учить букварь. (По крайней мере, хорошо, что это придумал не ты. Пример хрестоматийный.) Выглядит красиво, но на самом деле приводит к UB.
Подробнее см.: Стандарт, 5/4.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.01.2009, 21:24
CheshireCat, все с ним нормально, если руки прямые.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
20.01.2009, 21:34
"Не верю!" (с) К.С.Станиславский.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.01.2009, 21:36
Цитата Сообщение от CheshireCat Посмотреть сообщение
"Не верю!" (с) К.С.Станиславский.
Дело твое (c) Йа
0
Флудер
 Аватар для Ensase
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
22.01.2009, 21:49
vitalikk
вариант с xor и вариант с суммой работают без переполнения, причем на битах одинаково

Добавлено через 56 минут 29 секунд
во вложении код "квазипрофилеровщика" трех методов (сумма, xor, умножение)скомпилированого как файл *.cpp с помощью
"Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 15.00.30729.01 для 80x86" с параметрами по умолчанию
запускался на компьютере(Pentium Dual-Core T2370(1,73GHz), 3G RAM) под управлением Windows Vista Buisness SP 1 из коммандной строки:
start /realtime hew <первое число> <второе число>
результаты наблюдений:
1) xor > 17 ticks
2) сумма > 17 ticks
3) умножение > 52 ticks

p.s.: интересно узнать ваши результаты и/или результаты настоящего профилирования разных методов

p.p.s.: если есть ошибки в коде - пишите
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
22.01.2009, 22:36
На делфи цикл из 1 000 000 000 раз. Наверное, какой-то оптимизатор срабатывает... уж слишком подозрительно быстро всё получается:
1) xor - 1.156 с.
2) сумма - 1.157 с.
3) умножение - 15.671 с.
4) при использовании третей переменной - 0.797 с.
Причём, хорошая повторяемость. В общем, что и следовало ожидать... умножение и деление должны быть медленнее. К тому же, при умножении может возникнуть проблема с переполнением. А по скорости xor и сумма оказались одинаковыми. Но использование третей переменной на 30% быстрее.
1
 Аватар для vitalikk
6 / 6 / 0
Регистрация: 11.01.2009
Сообщений: 14
10.02.2009, 10:08  [ТС]
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
a= a+b - (b=a);
Не буду настаивать но мне кажется это решение наиболее оптимально
0
Флудер
 Аватар для Ensase
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
10.02.2009, 12:30
это то же самое что и обычный обмен суммой, да еще и пример плохого тона
0
 Аватар для Kalashnikov
15 / 15 / 3
Регистрация: 08.02.2009
Сообщений: 63
22.02.2009, 20:13
b=a+b
a=b-a
b=b-a
0
109 / 95 / 9
Регистрация: 19.02.2009
Сообщений: 312
24.02.2009, 19:13
Использование третьей переменной на любой платформе оптимальнее дополнительных операций. Более того, такой код лучше будет оптимизирован при компиляции. Да и просто логичнее использовать переменную, чем выполнять операции сложения/вычитания/xor без необходимости. Конечно, нестандартные и изящные методы всегда интересны, развивают мышление и повышают уровень навыков

Метод с XOR быстрее ADD/SUB на ряде процессоров, плюс с этому хорош для signed int чисел.

Если, например, требуется swap всего двух 32-разрядных переменных, пожно поступить так:

Вариант для двух 32-битных чисел


Delphi
1
2
3
4
5
6
7
8
9
// Декларируем их как массив: 
 
var z64: array [0..1] of longword;
 
// Меняем местами так, в одну строку.
 
int64(z64):= (int64(z64) shl 32) or (int64(z64) shr 32);
 
//z[0] и z[1] поменялись местами
Использование третьей переменной, все всеже, примерно в 4-5 раз быстрее.


А вот вариант для двух 16 битных чисел

Delphi
1
2
3
var z32: array [0..1] of word;
 
longword(z32):= (longword(z32) shl 16) + (longword(z32) shr 16);

Оптимизация

Delphi
1
2
3
4
5
asm
mov eax, z32
rol eax, 16
mov z32, eax
end;
В целом, вариант для двух 16-битных чисел значительно быстрее варианта для двух 32-х битных, а rol вариант для 16-битных быстрее варианта с shr/shl.

Вариант с простым присваиванием третьей переменной не догнать никак с использованием вычислений.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.02.2009, 19:13
Помогаю со студенческими работами здесь

Значение переменных поменять местами так, чтобы они оказались упорядоченными по убыванию
значение переменных X,Y,Z поменять местами так,чтобы они оказались упородоченными по убыванию

Значение переменных X, Y, Z поменять местами так, чтобы они оказались упорядоченными по возрастанию
значение переменых X Y Z поменять местами так чтобы они оказались упорялочными по возрастанию

Значение переменных поменять местами так, чтобы они оказались упорядоченными по возрастанию
Спасибо огромное Инфинити!!! за прошлый ответ . Робот может перемещаться в четырех направлениях(&quot;С&quot;-север,...

Значение переменных x,y,z поменять местами так, чтобы они оказались упорядоченными по убыванию
значение переменных x,y,z поменять местами так, чтобы они оказались упорядоченными по убыванию

Значение переменных X, Y, Z, поменять местами так, что бы они оказались упорядоченными по возрастанию.
И снова здравствуйте) Объясните пожалуйста алгоритм составление следующей задачи. Значение переменных X, Y, Z, поменять местами так, что бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru