Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11660
Последний выпуск: 19.06.2015

Экономия переменных

Автор: Предводителев Сергей /Niko/
Источник: http://niko.net.ru/
2003 год

Даны две целые переменные 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

Результат преобразовывается в десятичную форму счисления.

Скачать решение

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
25K
05 января 2007 года
Уильям Гейтс
0 / / 05.01.2007
Мне нравитсяМне не нравится
5 января 2007, 18:33:50
($a,$b)=($b,$a) the Perl language
2.
Аноним
Мне нравитсяМне не нравится
30 мая 2006, 13:44:16
{
> Но как мне таким способом поменять строковые переменные?

А ты попробуй посимвольно! А если одна из строк длиннее, то конец длинной добавь к короткой и ВСЁ!!! Единственный недостаток состоит в том, что это будет работать только если строка "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.

{Должно работать . . .}
3.
Аноним
+0 / -1
Мне нравитсяМне не нравится
30 июля 2005, 03:23:22
Вот это, конечно, прикольно:
a:=a+b;
b:=a-b;
a:=a-b;

Но как мне таким способом поменять строковые переменные?
4.
Аноним
+1 / -0
Мне нравитсяМне не нравится
26 июля 2005, 15:52:50
чё вы все ерепенитесь....
хорошая статья-пример!

вы все умные и флаг вам в руки.
а ведь есть те кто ещё мало чего знает, вот им эта информация и будет полезна...

так что моя оценка - 5.
5.
Аноним
Мне нравитсяМне не нравится
22 июля 2005, 17:18:04
push x;
push y;
pop x;
pop y;

самый быстрый, имхо
6.
Аноним
+1 / -0
Мне нравитсяМне не нравится
19 июля 2005, 20:08:39
1 и 2-й способ идентичны если кто не заметил, а если брать в расчёт кол-во операций и загрузку процессора то не фига мы не выигрываем :(
7.
Аноним
Мне нравитсяМне не нравится
19 июля 2005, 11:43:10
Прикольно.... а использовать это можно например в мааааленьких микроконтроллерах, в которых объём памяти учитывается побайтно, и можно выиграть немного памяти путём загружения проца =)
8.
Аноним
Мне нравитсяМне не нравится
19 июля 2005, 09:32:42
Действительно, чего уж там экономить на временных переменных :) Тем более они временные
9.
Аноним
Мне нравитсяМне не нравится
19 июля 2005, 08:24:43
1) стандартный алгоритм:
a:=a+b;
b:=a-b;
a:=a-b;

в етом случае будет большой косяк с большими значаниями а и b
10.
Аноним
Мне нравитсяМне не нравится
19 июля 2005, 03:15:26
глупости. просто фокус.
для будущих книг "занимательная информатика".
впрочем наверное такие штуки/шутки тоже нужны для какихто крайне редких случаев... или в качестве задачек на сообразительность.
11.
Аноним
Мне нравитсяМне не нравится
19 июля 2005, 03:06:48
вообще менять местами значения - задача на сегодня не так уж нужна
скорее всего статья претендует (особенно 2-ое решение) на самое быстрое решение задачи
решение 3:
на ассемблере исползовать стек
12.
Аноним
Мне нравитсяМне не нравится
19 июля 2005, 01:28:48
а есть ли смысл экономить на переменных? Что мы на этом выиграем?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог