Решаем задачи Абрамян на Паскале. Boolean14

Boolean14. Даны три целых числа: $$A$$, $$B$$, $$C$$. Проверить истинность высказывания: «Ровно одно из чисел $$A$$, $$B$$, $$C$$ положительное».

Решение:

 

Решение2:

1 часть не одно из чисел не равно 0

Т.к. при умножении «-» на «-» даёт «+», а числа всего 3, то при перемножении А,В и С,  вариантов, что результат положителен будет не так много: когда одно из 3 чисел положительно, или когда они все 3 числа положительные.

2 часть Варианты с 1 нулём

Ещё вариант когда 1 из чисел = 0, тогда A*B*C=0, a A*B+B*C+C*A должно быть меньше нуля, так как если одно и чисел равно нулю, то два умножения будут равны 0, а второе для нужного нам результата должно быть + и -.

При этом вариант из 1 части рассуждений, когда 3 чисел положительны мы исключаем.

3 часть Вариант с 2 нулями:

 

Если же два числа будут нулями, то A*B+B*C+C*A=0 и для нужного результата хоть одно из чисел должно быть положительное. Запишем:

(A*B*C>0) И ((A<0) ИЛИ (B<0) ИЛИ (C<0))

ИЛИ
(A*B*C=0) И (A*B+B*C+C*A<0)

ИЛИ
(A*B+B*C+C*A=0) И  ((A>0) ИЛИ (B>0) ИЛИ (C>0))

 

Т.к. и при (A*B*C=0) и при (A*B+B*C+C*A=0) выражение ((A>0) ИЛИ (B>0) ИЛИ (C>0)) не помешает, то можно объединить их

(A*B*C>0) И ((A<0) ИЛИ (B<0) ИЛИ (C<0))

ИЛИ
(A*B*C=0) И (A*B+B*C+C*A<=0) И  ((A>0) ИЛИ (B>0) ИЛИ (C>0))

Решение от olegst1975:

Выражение использующее исключающее  или

(a>0) xor (b>0) xor (c>0)

Имеет следующую таблицу решений

Значение a Значение b Значение c Результат
1 1 1 1
-1 1 1 0
1 -1 1 0
1 1 -1 0
-1 -1 1 1
1 -1 -1 1
-1 1 -1 1
-1 -1 -1 0

видно, что нас не устраивает только значени, которое происходит когда три числа положительные, поэтому исключаем его следующим выражением:

and(not((a>0)and(b>0)))

Решение от Натальи:

Другие задачи из раздела Boolean можно посмотреть здесь.

 

 

 

Комментарии:

Комментарии 7

  • ПРОВЕРИЛ: Не работает при значениях a=-6, b=0, c=7. Проблема b=0. Добавил «=».
    Writeln((A*B*C>=0) And ((A<0) or (B<0) or (C0)xor(b>0)xor(c>0))and(not((a>0)and(b>0))))

  • Было:

    Мда… этот вариант существенно усложнил жизнь….
    Записал первое решение прямое… как сказано в задании…
    К сожалению HTML съедает всё что похоже на теги и я могу предположить что вашь вариант выглядел так:

    Если это так подтвердите пожалуйста. Потому как я только предположительно могу понять как это работает, слишком уж я люблю свой мозг 🙂
    Свой же пример я переписал вот в это:

    Объяснение как я это получил ниже примера.
    Но по мне, так простой перебор выглядит уже намного привлекательней, чем это. 🙂

  • Но неправильно работает с тремя положительными числами, вынес как отдельное исключение(хватило даже a>0 и b>0). Итог – ((a>0)xor(b>0)xor(c>0))and(not((a>0)and(b>0))

  • writeln((ord(a>0)+ord(b>0)+ord(c>0))=1)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *