Экономия переменных
Даны две целые переменные a, b. Составить фрагмент программы, после исполнения которого значения переменных поменялись бы местами (новое значение a равно старому значению b и наоборот), при этом нельзя использовать дополнительные переменные.
Решение.
С использованием дополнительной переменной, решение данной задачи не представляет труда:
t := a; a := b; b := t;
Но по условию мы не можем использовать другие переменные. Попытка записать так:
a := b; b := a;
... не приводит к нужному результату, т. к. теряется значение a, т. е. обе переменные будут равны b.
Для решения поставленной задачи есть несколько способов.
1) стандартный алгоритм:
a:=a+b; b:=a-b; a:=a-b;
Это сработает только для небольших чисел, т.к. при использовании больших чисел, при их сложении может возникнуть переполнение. Поэтому наиболее приемлимым решением данной задачи будет следующий вариант.
2) Использование XOR(исключающая дизъюнкция):
a:=a xor b; b:=a xor b; a:=a xor b;
>Функция XOR производит сложение операндов в соответствии с таблицей истинности:
1 xor 1 = 0 1 xor 0 = 1 0 xor 1 = 1 0 xor 0 = 0
Результат преобразовывается в десятичную форму счисления.
Оставить комментарий
Комментарии
> Но как мне таким способом поменять строковые переменные?
А ты попробуй посимвольно! А если одна из строк длиннее, то конец длинной добавь к короткой и ВСЁ!!! Единственный недостаток состоит в том, что это будет работать только если строка "a" меньше своей возможной длинны!!!
}
program a1;
var
a,b:string;
BEGIN
a:='Text';
b:='LongTexttttt';
write(a,' и ',b);
a[byte(a[0])+1]:=#1;
repeat
if byte(a[byte(a[0])+1])>b[0] then
begin
b:=b+a[byte(a[byte(a[0])+1])];
end;
a[byte(a[byte(a[0])+1])]:=a[byte(a[byte(a[0])+1])] xor b[byte(a[byte(a[0])+1])];
b[byte(a[byte(a[0])+1])]:=a[byte(a[byte(a[0])+1])] xor b[byte(a[byte(a[0])+1])];
a[byte(a[byte(a[0])+1])]:=a[byte(a[byte(a[0])+1])] xor b[byte(a[byte(a[0])+1])];
a[byte(a[0])+1]:=chr(byte(a[byte(a[0])+1])+1);
until a[byte(a[0])+1]=a[0];
write(a,' и ',b);
END.
{Должно работать . . .}
a:=a+b;
b:=a-b;
a:=a-b;
Но как мне таким способом поменять строковые переменные?
хорошая статья-пример!
вы все умные и флаг вам в руки.
а ведь есть те кто ещё мало чего знает, вот им эта информация и будет полезна...
так что моя оценка - 5.
push y;
pop x;
pop y;
самый быстрый, имхо
a:=a+b;
b:=a-b;
a:=a-b;
в етом случае будет большой косяк с большими значаниями а и b
для будущих книг "занимательная информатика".
впрочем наверное такие штуки/шутки тоже нужны для какихто крайне редких случаев... или в качестве задачек на сообразительность.
скорее всего статья претендует (особенно 2-ое решение) на самое быстрое решение задачи
решение 3:
на ассемблере исползовать стек