Трамвайные билеты(#1002)
#1001
Задача g6_1001: Проблема с A и B.
Поменять значения переменных A и B между собой, не заводя дополнительных переменных. Входной файл input.txt содержит числа a и b (0 <= a, b <= 32767). В выходном файле output.txt должны содержаться значения этих переменных после обмена.
Решение g6_1001:
Первая мысль, приходящая в голову, это написать программу, похожую на эту:
A := B;
B := A;
Естественно, это программа работать не будет (в обеих переменных будет значение B).
Теперь поищем правильное решение. Обозначим начальное значение A за A1, B за B1. Тогда необходимо, чтобы по окончании работы программы A равнялось B1, а B - A1.
0) A = A1; B = B1;
1) Занесем в переменную A результат суммирования A и B (A := A + B):
A = A1 + B1; B = B1;
2) Занесем в переменную B разность A и B (B := A - B):
A = A1 + B1; B = A1;
3) Занесем в переменную A разность A и B (A := A - B):
A = B1; B = A1;
Код программы:
A := A + B;
B := A - B;
A := A - B;
Ура!
Этого решения хватило мне, чтобы сдать эту задачу в школе на уроке, однако дома я нашел в этом алгоритме несколько слабых моментов:
1) Возможно переполнение переменных. Это зависит от настроек компилятора.
2) А что, если переменные не числовые? Например char.
Это привело меня ко второму решению:
Для начала разберемся, что такое логическая операция xor. Вот несколько ее свойств:
1) A xor A = 0;
2) A xor B = B xor A;
3) A xor (A xor B) = B;
Их нам вполне достаточно, чтобы написать новую программу, которая меньше зависит от типа данных A и B:
Код программы:
A := A xor B;
B := A xor B;
A := A xor B;
Разобраться в ней не так уж сложно.
Скачать тесты к задаче
Наверх