Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2016.05.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





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


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


15-1439244279
Германн
2015-08-11 01:04
2016.05.01
Футы и узлы в современной авиации.


15-1439585926
Sha
2015-08-14 23:58
2016.05.01
Головоломка выходного дня.


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский