С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/65: Рейтинг темы: голосов - 65, средняя оценка - 4.62
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
1

Обмен значениями двух переменных

15.09.2013, 18:13. Показов 13092. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нашёл на другом форуме занятную формулу обмена значений двух переменных(очевидно на с++):
b = – –a + (a=b)*0;
Проверил на числах 1 и 101, рез 101 и 101. Помогите, было бы круто, формула в одну строку.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2013, 18:13
Ответы с готовыми решениями:

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

Обмен значениями двух переменных А и В без использования вспомогательной переменной
Сконструировать алгоритм обмена значениями двух переменных А и В без использования вспомогательной...

Выполнить обмен значениями двух переменных используя указатели на эти переменные
Выполнить обмен значениями двух переменных используя указатели на эти переменные.

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

36
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
15.09.2013, 18:19 2
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Помогите, было бы круто, формула в одну строку.
что то сомнения она у меня вызывает похоже на неопределенное поведение
а чем тебя не устраивает классическое
C++
1
2
3
a=a^b;
b=b^a;
a=a^b;
ну или арифметический вариант
C++
1
2
3
a=a+b;
b=a-b;
a=a-b;
2
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:21  [ТС] 3
Цитата Сообщение от ValeryS Посмотреть сообщение
что то сомнения она у меня вызывает похоже на неопределенное поведение
а чем тебя не устраивает классическое
Задали придумать семь способов, 6 уже осилил, нужен седьмой.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37352 / 20782 / 4277
Регистрация: 12.02.2012
Сообщений: 34,192
Записей в блоге: 14
15.09.2013, 18:24 4
Цитата Сообщение от ValeryS Посмотреть сообщение
ну или арифметический вариант
- этот вариант может вызвать переполнение...
1
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
15.09.2013, 18:36 5
Цитата Сообщение от Catstail Посмотреть сообщение
- этот вариант может вызвать переполнение...
может посему "исключающие ИЛИ" более надежен
да и более красив по моему
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Задали придумать семь способов, 6 уже осилил, нужен седьмой.
ну этот то явно не годится или ты не так списал
Цитата Сообщение от Андрей1992 Посмотреть сообщение
b = – –a + (a=b)*0;
смотри 2 числа
сначала a=b поскольку в скобках
получилось два числа b
потом умножаем на 0
получаем
b= - -b+0;
b=b

Добавлено через 2 минуты
Цитата Сообщение от Андрей1992 Посмотреть сообщение
6 уже осилил, нужен седьмой.
покаж что осилил
1
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 18:39 6
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Нашёл на другом форуме занятную формулу обмена значений двух переменных(очевидно на с++):
b = – –a + (a=b)*0;
Проверил на числах 1 и 101, рез 101 и 101. Помогите, было бы круто, формула в одну строку.
C++
1
2
3
#include <utility>
...
std::swap(a, b);
1
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:43  [ТС] 7
Цитата Сообщение от ValeryS Посмотреть сообщение
покаж что осилил
Доп. переменная
C++
1
2
3
с=a;
a=b;
b=c;
Сумма-разность
C++
1
2
3
a=a+b;
b=a-b;
a=a-b;
XOR
C++
1
2
3
a=a^b;
b=b^a;
a=a^b;
Сумма
C++
1
2
3
a=-(a+b);
b=-(a+b);
a=-(a+b);
Деление умножение
C++
1
2
3
a=a/b;
b=b*a;
a=b/a;
Какая-то абракадабра
C++
1
2
3
a=a+2*(b-a);
b=b-(a-b);
a=a-(a-b)/2;
Может не всё подходит не для всех типов, но это и не требуется, нужно чтобы для целых чисел подходило.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37352 / 20782 / 4277
Регистрация: 12.02.2012
Сообщений: 34,192
Записей в блоге: 14
15.09.2013, 18:44 8
Цитата Сообщение от ValeryS Посмотреть сообщение
может посему "исключающие ИЛИ" более надежен
да и более красив по моему
- безусловно! И более быстр.
0
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:46  [ТС] 9
Цитата Сообщение от Nekto Посмотреть сообщение
C++
1
2
3
#include <utility>
...
std::swap(a, b);
способы нужны ещё такие, которые можно применить математически, а способности языка и компьютера всё таки не то.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 18:47 10
Цитата Сообщение от Андрей1992 Посмотреть сообщение
способы нужны ещё такие, которые можно применить математически, а способности языка и компьютера всё таки не то.
Раздел форума не тот.
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
15.09.2013, 18:53 11
в порядке бреда
цикл через флаг переноса (поскольку в Си нет эмулируем)
для байта
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned char a=5;
unsigned char b=7;
 
unsigned char bt1=a&0x01;
unsigned char bt2=b&0x01;
 
for(int i=0;i<8;i++)
{
 a=a>>1+0x80*bt2;
 b=b>>1+0x80*bt1;
 bt1=a&0x01;
 bt2=b&0x01;
}
для int цикл увеличить до 32 и умножать на 0x80000000
1
2686 / 2258 / 244
Регистрация: 03.07.2012
Сообщений: 8,219
Записей в блоге: 1
15.09.2013, 18:55 12
Цитата Сообщение от Catstail Посмотреть сообщение
- безусловно! И более быстр.
Но не быстрее элементарного и универсального:
C++
1
2
3
x=a;
a=b;
b=x;
1
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 20:47  [ТС] 13
Всем спасибо, нашёл 7 способ.
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
15.09.2013, 21:02 14
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Всем спасибо, нашёл 7 способ.
ну дак покаж
0
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 22:43  [ТС] 15
Цитата Сообщение от ValeryS Посмотреть сообщение
ну дак покаж
Ничего интересного, обычное извращение с арифметикой.
C++
1
2
3
a=a*10000+b;
b=a / 10000;
a=a % 10000;
0
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
15.09.2013, 22:50 16
вот восьмой способ ))
C++
1
2
3
4
5
6
7
8
9
    int a, b;
    cin >> a;   // 2
    cin >> b;   // 3
 
    a+=b;       // a=5
    b=a-b;      // b=5-3=2
    a=a-b;      // a=5-2=3
 
    cout << a << " " << b;
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,708
15.09.2013, 22:59 17
_,
извини конечно но это не восьмой а второй способ что у автора что у меня
Цитата Сообщение от ValeryS Посмотреть сообщение
ну или арифметический вариант
C++
1
2
3
a=a+b;
b=a-b;
a=a-b
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Сумма-разность
C++
1
2
3
a=a+b;
b=a-b;
a=a-b;
и вот на него реакция
Цитата Сообщение от Catstail Посмотреть сообщение
- этот вариант может вызвать переполнение...
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Ничего интересного, обычное извращение с арифметикой.
мда, имеет место быть но для чисел положительных и меньше 9999
на эту же тему логический способ
числа положительные и не больше 16 бит
C++
1
2
3
a=a<<16|b;
b=a>>16;
a=a&0xFFFF;
так называемые "упакованные числа"
2
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
16.09.2013, 18:15  [ТС] 18
Цитата Сообщение от ValeryS Посмотреть сообщение
на эту же тему логический способ
числа положительные и не больше 16 бит
C++
1
2
3
a=a<<16|b;
b=a>>16;
a=a&0xFFFF;
так называемые "упакованные числа"
Спасибо, классный способ, мне понравился.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37352 / 20782 / 4277
Регистрация: 12.02.2012
Сообщений: 34,192
Записей в блоге: 14
16.09.2013, 18:20 19
Цитата Сообщение от Андрей1992 Посмотреть сообщение
классный способ
- так этот способ нечестный: он использует старшие разряды int для двухбайтовых целых. Что эквивалентно наличию аж двух дополнительных 16-битных переменных.
0
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
16.09.2013, 18:26  [ТС] 20
Цитата Сообщение от Catstail Посмотреть сообщение
- так этот способ нечестный: он использует старшие разряды int для двухбайтовых целых. Что эквивалентно наличию аж двух дополнительных 16-битных переменных.
Любой способ имеет право на существование, занесём расход памяти в минус этого способа.
0
16.09.2013, 18:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2013, 18:26
Помогаю со студенческими работами здесь

Обмен значениями двух чисел через указатели и функцию
Должны использоваться аргументы типа ( int * ) Вот код: #include &lt;iostream&gt; void...

Обмен значений двух переменных
Ниже решение задачи (Задана целочисленная последовательность A = (a i), i = 1..n, n &lt;= 100.*...

Программа обмена значениями двух переменных a и b
3.8 Составить программу обмена значениями двух переменных a и b. Разработать два варианта решения...

Обмен значений двух переменных типа char
Не знаю как вообще использовать такой тип как char, сама программа звучит так: Даны значения...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru