Задача 1: Проблема с A и B.
Поменять значения переменных A и B между собой, не заводя
дополнительных переменных. Входной файл input.txt содержит числа a и
b (0 <= a, b <= 32767). В выходном файле output.txt должны
содержаться значения этих переменных после обмена.
Решение: Первая мысль, приходящая в голову, это написать
программу, похожую на эту:
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;
Разобраться в ней
не так уж сложно.
Далее
ð