Boolean14. Даны три целых числа: $$A$$, $$B$$, $$C$$. Проверить истинность высказывания: «Ровно одно из чисел $$A$$, $$B$$, $$C$$ положительное».
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
program Boolean14; var A,B,C: Real; begin Write('A: '); Readln(A); Write('B: '); Readln(B); Write('C: '); Readln(C); Writeln(((A>0) and (B<=0) and (C<=0)) or ((A<=0) and (B>0) and (C<=0)) or ((A<=0) and (B<=0) and (C>0))); readln; end. |
Решение2:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
program Boolean14; var A,B,C: Real; begin Write('A: '); Readln(A); Write('B: '); Readln(B); Write('C: '); Readln(C); Writeln(((A*B*C>0) and ((A<0) or (B<0) or (C<0))) or ((A*B*C=0) and (A*B+B*C+C*A<=0)) and ((A>0) or (B>0) or (C>0)))); end. |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
program Boolean14; var A,B,C: Real; begin Write('A: '); Readln(A); Write('B: '); Readln(B); Write('C: '); Readln(C); Writeln( ((a>0)xor(b>0)xor(c>0))and(not((a>0)and(b>0))) ); readln; end. |
Выражение использующее исключающее или
(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)))
Решение от Натальи:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
program Boolean14; var A,B,C: Real; begin Write('A: '); Readln(A); Write('B: '); Readln(B); Write('C: '); Readln(C); writeln((ord(A>0)+ord(B>0)+ord(C>0))=1); readln; end. |
Другие задачи из раздела Boolean можно посмотреть здесь.
ПРОВЕРИЛ: Не работает при значениях 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 съедает всё что похоже на теги и я могу предположить что вашь вариант выглядел так:
Если это так подтвердите пожалуйста. Потому как я только предположительно могу понять как это работает, слишком уж я люблю свой мозг 🙂
Свой же пример я переписал вот в это:
Объяснение как я это получил ниже примера.
Но по мне, так простой перебор выглядит уже намного привлекательней, чем это. 🙂
Похоже на Boolean10, но уже три числа — проситься (a>0)xor(b>0)xor(c>0).
Но неправильно работает с тремя положительными числами, вынес как отдельное исключение(хватило даже 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)
О очень круто! добавил в шапку.