Операции с числами
От: Bora  
Дата: 27.11.04 17:23
Оценка: :)
А отгадайте задачку: как поменять местами заначения переменных x и y не используя третьей промежуточной?
Re: Операции с числами
От: Программер  
Дата: 27.11.04 17:52
Оценка: 1 (1) -1
Здравствуйте, Bora, Вы писали:

B>А отгадайте задачку: как поменять местами заначения переменных x и y не используя третьей промежуточной?


x = x+y
y = x-y
x = x-y

Короче придумать не могу.
Re: Операции с числами
От: fAX Израиль  
Дата: 27.11.04 18:32
Оценка:
Здравствуйте, Bora, Вы писали:

B>А отгадайте задачку: как поменять местами заначения переменных x и y не используя третьей промежуточной?

Ну, кроме метода треугольника, есть ещё и старый добрый XOR (исключающее или).
a ^= b ^= a ^= b


Что эквивалентно:
a = a xor b
b = a xor b
a = a xor b
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re: Операции с числами
От: xtile  
Дата: 27.11.04 19:10
Оценка: 1 (1) +2 :)))
Здравствуйте, Bora, Вы писали:

B>А отгадайте задачку: как поменять местами заначения переменных x и y не используя третьей промежуточной?


Это задача на навыки владения поиском по rsdn.

http://www.rsdn.ru/Forum/Message.aspx?mid=222033
Автор: cyc10ne
Дата: 24.03.03
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[2]: Операции с числами
От: krasin Россия  
Дата: 28.11.04 00:00
Оценка: :)))
Здравствуйте, xtile, Вы писали:


X>Это задача на навыки владения поиском по rsdn.


Для тех кому задача показалась простой, уточняем: переменные типа Object
Re[3]: Операции с числами
От: fAX Израиль  
Дата: 28.11.04 00:05
Оценка:
Здравствуйте, krasin, Вы писали:

K>Здравствуйте, xtile, Вы писали:



X>>Это задача на навыки владения поиском по rsdn.


K>Для тех кому задача показалась простой, уточняем: переменные типа Object

Ну, для каждого типа Object можно сделать тоже самое, используя "грязные" reinterpret_cast'ы необходимое количество раз (для каждого типа определяется во время компиляции ==> никаких переменных.
Могу написать шаблон на С++.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[3]: Операции с числами
От: fAX Израиль  
Дата: 28.11.04 00:16
Оценка:
Здравствуйте, krasin, Вы писали:

K>Здравствуйте, xtile, Вы писали:



X>>Это задача на навыки владения поиском по rsdn.


K>Для тех кому задача показалась простой, уточняем: переменные типа Object

К тому же, в таком случае очень полезно уточнить, что такое "поненять местами" для типа Object. И это даже не вопрос семантики (value, reference), а вопрос консистентности.

Допустим, соблюдается:

a == peer[index(&a)];
b == peer[index(&b)];


Ну, и как здесь "поменять местами"?!
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[2]: Операции с числами
От: p_kolya  
Дата: 28.11.04 09:08
Оценка:
Здравствуйте, fAX, Вы писали:

fAX>Ну, кроме метода треугольника, есть ещё и старый добрый XOR (исключающее или).

XOR кстати лучше. Т.к. если использовать +/- то можно просто и переполнение получить! Если числа будут довольно большие Потому XOR рулит! Задача кстати элементарная
Best regards, p_kolya. WinAmp сообщает: Тишина — лучшая музыка
Re[4]: Операции с числами
От: krasin Россия  
Дата: 28.11.04 13:38
Оценка:
fAX>Допустим, соблюдается:

fAX>
fAX>a == peer[index(&a)];
fAX>b == peer[index(&b)];
fAX>


fAX>Ну, и как здесь "поменять местами"?!


Поясните, пожалуйста, что имеется ввиду?
Re[5]: Операции с числами
От: fAX Израиль  
Дата: 28.11.04 15:00
Оценка:
Здравствуйте, krasin, Вы писали:

fAX>>Допустим, соблюдается:


fAX>>
fAX>>a == peer[index(&a)];
fAX>>b == peer[index(&b)];
fAX>>


fAX>>Ну, и как здесь "поменять местами"?!


K>Поясните, пожалуйста, что имеется ввиду?

Имеется в виду то, что не всегда обмен "содержимого" объектов приводит к легальному результату. Возьмите (гипотетически) Java — совсем не уверен, что такой обмен возможен из-за garbage collector'a.
А бывают ещё языки в которых нельзя вообще изменить значение после инициализации. Тут вообще затронут вопрос гораздо более серьёзный: что считать совместимыми типами. 1..10 и 3..12 — одинаковый тип. А если язык weakly-typed? и там вместе со значением хранится тип? А может ещё храниться флаг, если значение — часть структуры. Ну и как тут поменять целое, которое "само по себе" и целое, которое является полем структуры?
Кстати, в том же С++, думается, со множественным наследованием можно начудить что не все объекты будут взаимозаменяемы.... (Hint: virtual table во время различных casting-ов).

Вот так-то. Или это флейм, или уточните вопрос: что такое "поменять местами" и какие операции допустимы над "объектом"!
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[6]: Операции с числами
От: krasin Россия  
Дата: 28.11.04 15:31
Оценка:
fAX>Вот так-то. Или это флейм, или уточните вопрос: что такое "поменять местами" и какие операции допустимы над "объектом"!

Будем считать, что переменные, значения которых надо поменять, являются локальными переменными типа Object (так как это понимается в Java или C#).

Тогда не ставится вопрос целостности и взаимозаменяемости, т.к. всегда возможна стандартная форма обмена:
Object a, b, temp;
...
temp = a;
a = b;
b = temp;


Будем считать, что у кода нет permission на unsafe context, т.е адресная арифметика не может быть использована. В такой постановке вопроса, я не вижу как поменять значения двух переменных без использования третьей, в то время как смысл такой замены есть.
Re[7]: Операции с числами
От: fAX Израиль  
Дата: 28.11.04 16:12
Оценка:
Здравствуйте, krasin, Вы писали:

fAX>>Вот так-то. Или это флейм, или уточните вопрос: что такое "поменять местами" и какие операции допустимы над "объектом"!


хъ

K>Будем считать, что у кода нет permission на unsafe context, т.е адресная арифметика не может быть использована. В такой постановке вопроса, я не вижу как поменять значения двух переменных без использования третьей, в то время как смысл такой замены есть.

Как раз это-то и зависит от операций над объектами! Ведь в примерах выше никто не лез во внутреннее представление int'а.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[3]: Операции с числами
От: McSeem2 США http://www.antigrain.com
Дата: 28.11.04 16:30
Оценка:
Здравствуйте, p_kolya, Вы писали:

fAX>>Ну, кроме метода треугольника, есть ещё и старый добрый XOR (исключающее или).

_>XOR кстати лучше. Т.к. если использовать +/- то можно просто и переполнение получить! Если числа будут довольно большие Потому XOR рулит! Задача кстати элементарная

Да и хрен с нит с переполнением, на целых числах оно ни на что не повлияет. Учите матчасть, "операции сложения и вычитания в дополнительном коде".
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: Операции с числами
От: SiAVoL Россия  
Дата: 29.11.04 06:34
Оценка:
Здравствуйте, krasin, Вы писали:

K>Для тех кому задача показалась простой, уточняем: переменные типа Object

угу, писать на шарпе. Кому мало, писать на сэйф шарпе, вот тогда то мы повеселимся
... << RSDN@Home 1.1.4 beta 3 >>
Re[3]: Операции с числами
От: xtile  
Дата: 29.11.04 07:03
Оценка:
Здравствуйте, krasin, Вы писали:

K>Здравствуйте, xtile, Вы писали:



X>>Это задача на навыки владения поиском по rsdn.


K>Для тех кому задача показалась простой, уточняем: переменные типа Object


Что за тип такой — Object ? Из паскаля, чтоль ? Тогда нужно определить конструктор копирования и оператор = (давно с паскалем не имел дела, не уверен вообще в возможности переопределения операторов в нем).

Дальше, составные классы всегда состоят из простых типов, и всегда можно переопределить ^ (xor) для класса так, чтобы xor'ились отдельно эти простые элементы.

Возможно я что-то недопонял, тогда распишите подробнее.
Re[2]: Операции с числами
От: mkopachev  
Дата: 29.11.04 09:25
Оценка:
Здравствуйте, fAX, Вы писали:

fAX>Здравствуйте, Bora, Вы писали:


B>>А отгадайте задачку: как поменять местами заначения переменных x и y не используя третьей промежуточной?

fAX>Ну, кроме метода треугольника, есть ещё и старый добрый XOR (исключающее или).
fAX>
fAX>a ^= b ^= a ^= b
fAX>


fAX>Что эквивалентно:

fAX>
fAX>a = a xor b
fAX>b = a xor b
fAX>a = a xor b
fAX>


Классическая ошибка. Если объекты будут переданы по ссылкам, и случайно будет передан в качестве A и B один и тот же объект то вместо обмена получим обнуление!

Правильно так:
  if A <> B
    then begin
      A := A xor B;
        B := A xor B;
        A := A xor B;
    end;


З.Ы. Это не придирка — из-за такой ошибки были вскрыты несколько реализаций шифра RC4
... << RSDN@Home 1.1.4 @@subversion >>
Re[3]: Операции с числами
От: Кодт Россия  
Дата: 29.11.04 09:52
Оценка: 1 (1) +1
Здравствуйте, mkopachev, Вы писали:

M> Классическая ошибка. Если объекты будут переданы по ссылкам, и случайно будет передан в качестве A и B один и тот же объект то вместо обмена получим обнуление!

M>З.Ы. Это не придирка — из-за такой ошибки были вскрыты несколько реализаций шифра RC4

Потому что нефиг было изображать кулькодеров. Сделали бы через промежуточную переменную, и было бы им щастье.
(Это к вопросу о практической пользе таких задачек).
Перекуём баги на фичи!
Re[4]: Операции с числами
От: mkopachev  
Дата: 30.11.04 09:31
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, mkopachev, Вы писали:


M>> Классическая ошибка. Если объекты будут переданы по ссылкам, и случайно будет передан в качестве A и B один и тот же объект то вместо обмена получим обнуление!

M>>З.Ы. Это не придирка — из-за такой ошибки были вскрыты несколько реализаций шифра RC4

К>Потому что нефиг было изображать кулькодеров. Сделали бы через промежуточную переменную, и было бы им щастье.

К>(Это к вопросу о практической пользе таких задачек).
Солидарен
... << RSDN@Home 1.1.4 @@subversion >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.