Форум: "Прочее";
Текущий архив: 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