Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.05.01;
Скачать: CL | DM;

Вниз

Загадка-минутка   Найти похожие ветки 

 
Sha ©   (2015-08-17 21:40) [0]

Что может вывести на экран следующий фрагмент кода
(звездочкой обозначена неизвестная целочисленная операция):

 a, b, c, d: integer;
 ...
 if a*b - c*d = - c*d + a*b
 then ShowMessage("EQ")
 else ShowMessage("NE");


Минута на размышление, время пошло ))


 
Rouse_ ©   (2015-08-17 22:11) [1]

Минус


 
Rouse_ ©   (2015-08-17 22:13) [2]

Пардон, Eq


 
Sha ©   (2015-08-17 22:28) [3]

подождем, может еще знатоки подтянутся...


 
Rouse_ ©   (2015-08-17 22:42) [4]

Саш, ну минус же, значит... Лан подождем


 
megavoid ©   (2015-08-18 00:53) [5]

Всегда EQ, т.к. от перемены мест слагаемых: 5-2 = -2+5

Я, правда, чего-то запараноился вопреки логике, вдруг при граничных значениях integer всё-таки где-то да выдаст NE, ну не просто же так вопрос :)


procedure TForm1.Button1Click(Sender: TObject);
var
 a,b,c,d: integer;
begin

 for a := -1 to 1 do begin
   for b := -1 to 1 do begin
       for c := -1 to 1 do begin
           for d := -1 to 1 do begin

             if a*b - c*d = - c*d + a*b then
               begin
                 // ShowMessage("EQ")
               end
               else
               begin
                 Memo1.Lines.Add("NE " +
                   IntToStr(a) + " " + IntToStr(b) + " " + IntToStr(c) + " " + IntToStr(d)
                 );
                 // ShowMessage("NE");
               end;

           end;
       end;
   end;
 end;

end;


 
megavoid ©   (2015-08-18 00:58) [6]

а, ну вот так будет divide by zero, разумеется

if a div b - c div d = - c div d + a div b then


 
megavoid ©   (2015-08-18 01:03) [7]

Ещё при a,b = max(integer) или чуть поменьше, будет переполнение, если * это операция умножения.


 
megavoid ©   (2015-08-18 01:08) [8]

Я не математик, с утра обязательно почитаю, в каком случае вылезает NE :)


 
SergP ©   (2015-08-18 04:51) [9]


> megavoid ©   (18.08.15 01:08) [8]
>
> Я не математик, с утра обязательно почитаю, в каком случае
> вылезает NE :)


Ну тут скорее дело не в математике, а в самом Дельфи

Я конечно не вникал в тонкости компилятора, но
есть такие предположения:

1. Что-то связаное с типом к которому приводится результат в процессе вычисления.

2. Что-то связанное с приоритетом операций.
Например:
a)  в левой и правой части минусы разные и имеют разный приоритет, в правой части минус по идее имеет больший приоритет даже чем умножение. (правда на 100% не уверен).
б) если неизвестная целочисленная операция будет or или xor, то у нее приоритет будет такой же как у сложения или вычитания, что без использования скобок приведет с совершенно разным результатам и в итоге получим NE


 
SergP ©   (2015-08-18 04:55) [10]

например

if (((a or b) - c) or d) = ((((- c) or d) + a) or b)

скобки ничего не меняют и приведены для наглядности приоритетов


 
Pavia ©   (2015-08-18 10:15) [11]

Равно всегда.
За исключением div где возможно переполнение.
И глюка компилятора если тот выкинет первые 2 строчки и оставит 3. Тоже такое где-то было.


 
Sha ©   (2015-08-18 10:17) [12]

Чтобы подогреть интерес, скажу, что действительно может быть выдано NE.
Теперь вопрос, как этого добиться?


 
Ринсвинд ©   (2015-08-18 11:30) [13]

Решение как-то связано с тем, что максимальное отрицательное число типа integer на единицу больше максимального положительного?
-214748364[8]..214748364[7]


 
SergP ©   (2015-08-18 12:04) [14]

Похоже тут нужно уточнить условие...
Какой может быть неизвестная целочисленная операция? Может ли это быть OR, XOR ?

Нужно выяснить или может быть выдано NE для определенных целочисленных операций, или для любых?


 
Sha ©   (2015-08-18 12:28) [15]

> SergP ©   (18.08.15 12:04) [14]

Операции: + - * div or xor and shr shl
Какая из них (если ей заменить * в условии) может дать NE.
Если таких операций несколько, надо указать их все.




> Ринсвинд ©   (18.08.15 11:30) [13]

Думаю, что нет. Но вдруг, я не прав )


 
Sha ©   (2015-08-18 12:31) [16]

> Sha ©   (18.08.15 12:28) [15]

Забыл еще одну операцию: mod


 
SergP ©   (2015-08-18 13:03) [17]


> Операции: + - * div or xor and shr shl


Думаю что NE могут дать  or, xor, and и shr
Ну и еще div может выдать "divide by zero"


 
SergP ©   (2015-08-18 13:05) [18]


> Забыл еще одну операцию: mod


mod так же как и div может выдать "divide by zero"


 
Ринсвинд ©   (2015-08-18 13:06) [19]

А я сперва подумал, что нужно найти такие a, b, c, d, при которых выражение станет ложным. А знак умножения не менять.

Если знак умножения можно заменить, то подойдут как минимум shr, xor и and.


> procedure TForm1.Button4Click(Sender: TObject);
> var a, b, c, d: integer;
> begin
>   a := 3;
>   b := 3;
>   c := 3;
>   d := 3;
>
>   if a shr b - c shr d = - c shr d + a shr b
>   then Caption := Caption + "+"
>   else Caption := Caption + "-";
>
>   if a xor b - c xor d = - c xor d + a xor b
>   then Caption := Caption + "+"
>   else Caption := Caption + "-";
>
>   if a and b - c and d = - c and d + a and b
>   then Caption := Caption + "+"
>   else Caption := Caption + "-";
> end;


После выполнения Caption = "---".

Или я опять неправильно понял условия задачи? Возможно, false должно быть при любых a, b, c, d?


 
SergP ©   (2015-08-18 13:15) [20]


> Возможно, false должно быть при любых a, b, c, d?


навряд-ли... при нулевых значениях всех четырех переменных, вроде NE ни одна операция не выдаст, а mod и div выдадут "divide by zero"


 
Sha ©   (2015-08-18 14:43) [21]

> SergP ©   (18.08.15 13:03) [17]
> Думаю что NE могут дать  or, xor, and и shr

Верно.
Пусть a=0,  b=1, c=1,  d=1.
Тогда
если *=or, то left=1, right=-1
если *=xor, то left=1, right=-1
если *=and, то left=-1, right=1
если *=shr, то left=0, right=2147483647


 
megavoid ©   (2015-08-18 15:35) [22]

эх, был первым на правильном пути :) or, xor, and, shr - и целочисленные операции тоже, и не поспоришь :))) я же ограничился лишь академическими + - * div ^


 
SergP ©   (2015-08-18 16:46) [23]

Кстати, что интерестно и вроде как парадоксально (разумеется только на первый взгляд): shr может дать NE, а вот shl нет
:)


 
Sha ©   (2015-08-18 16:59) [24]

> SergP ©   (18.08.15 16:46) [23]

потому что shl эквивалентно умножению,
а shr не эквивалентно делению


 
Rouse_ ©   (2015-08-18 17:19) [25]


> megavoid ©   (18.08.15 15:35) [22]

Тоже самое, правда у меня была мысль о переполнении при -С на границе MaxInt, но не оно.


 
Rouse_ ©   (2015-08-18 19:37) [26]


> Sha ©   (18.08.15 16:59) [24]
> > SergP ©   (18.08.15 16:46) [23]
>
> потому что shl эквивалентно умножению,
> а shr не эквивалентно делению

Дополню: http://alexander-bagel.blogspot.ru/2012/08/blog-post_2566.html



Страницы: 1 вся ветка

Текущий архив: 2016.05.01;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.007 c
15-1431731742
Германн
2015-05-16 02:15
2016.05.01
Какой бесплатный почтовый сервер можете посоветовать?


15-1439415001
Юрий
2015-08-13 00:30
2016.05.01
С днем рождения ! 13 августа 2015 четверг


6-1279796725
Буржуй
2010-07-22 15:05
2016.05.01
Работа с XMLDOCUMENT


15-1440192604
Юрий
2015-08-22 00:30
2016.05.01
С днем рождения ! 22 августа 2015 суббота


15-1438978574
Dimka Maslov
2015-08-07 23:16
2016.05.01
Такие вот дела.