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

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

16.01.2009, 12:44. Показов 36120. Ответов 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
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
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
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru