Реши задачу с кругов Эйлера
В языке за поискового сервера для обозначения логической операции «ИЛИ» используется символ «|», а для обозначения логической операции «И» — символ «&». Приведены за и количество найденных по ним страниц некоторого сегмента сети Интернет. Окунь=35,
Судак=25,
Налим=40,
Окунь | Судак | Налим=70,
Окунь & Налим=10,
Окунь & Судак=0
Какое количество страниц (в сотнях тысяч) будет найдено по за Судак & Налим?
1 - 1101101₂ = 155₈ = 109₁₀ = 6D₁₆
2 - 100101₂ = 45₈ = 37₁₀ = 25₁₆
3 - 10010₂ = 022₈ = 18₁₀ = 12₁₆
4 - 10101011₂ = 253₈ = 171₁₀ = AB₁₆
Объяснение:
1) 1101101₂ = 155₈
001 101 101 - разбиваем на разряды по 3 символа, а из двоичной в восьмеричную: 001 = 1, 101 = 5, поэтому 1 5 5.
1101101₂ = 2⁶*1 + 2⁵*1 + 2⁴*0 + 2³*1 + 2²*1 + 2¹*0 + 2⁰*1 = 64 + 32 + 0 + 8 + 4 + 0 + 1 = 109₁₀
1101101₂ = 6D₁₆
0110 1101 - разбиваем на разряды по 4 символа, а из двоичной в восьмеричную: 0110 = 6, 1101 = D, поэтому 6D.
2) 100101₂ = 45₈
4₈ = 100₂; 5₈ = 101₂.
45₈ = 8¹*4 + 8⁰*5 = 32 + 5 = 37₁₀
45₈ = 100101₂ = 25₁₆
Сначала переводим в 2-ю СС, потом в 16-ю СС: 0010 0101
0010₂ = 2₁₆; 0101₂ = 5₁₆.
3) в двоичную СС (mod - остаток от деления, каждый раз делим число на 2):
18 mod 2 = 0
9 mod 2 = 1
4 mod 2 = 0
2 mod 2 = 0
1 mod 2 = 1
Остаток от деления записываем в обратном порядке. Получаем: 10010₂.
В восьмеричную СС (mod - остаток от деления, каждый раз делим число на 8):
18 mod 8 = 2
2 mod 8 = 2
0 mod 8 = 0
Остаток от деления записываем в обратном порядке. Получаем: 022₈.
В шестнадцатеричной (mod - остаток от деления, каждый раз делим число на 16):
18 mod 16 = 2
1 mod 16 = 1
Остаток от деления записываем в обратном порядке. Получаем: 12₁₆
4) AB₁₆ = 10101011₂
A₁₆ = 1010₂; B₁₆ = 1011₂
10101011₂ = 253₈:
берём число в 2-й СС, потом разбиваем на разряды по 3 числа: 010 101 011: 010₂ = 2₈, 101₂ = 5₈, 011₂ = 3₈.
10101011₂ = 16¹*10 + 16⁰*11 = 160 + 11 = 171
Решение "в лоб": на логических конструкциях.
isInt(s) - целочисленное ли число в строке
isFloat(s) - вещественное ли число в строке
Стоит внести ясность в конструкции на строках 25, 27 и 28. Начнём по порядку:1. (int(a) if isIntA else float(a)) + (int(b) if isIntB else float(b)) - сумма результатов двух тернарных операторов, имеющих вид:
<результат при True> if <условие> else <результат при False>
Если перевести на русский язык: <перевод строки в целочисленное число>, если <в строке a целочисленное число>, иначе <перевод строки в вещественное число>. Аналогично с выражением после +.
2. isIntOrFloatA ^ isIntOrFloatB - логическая операция XOR, которая возвращает True только в двух случаях: когда только один из операторов равен True или False.
3. 1 if isIntOrFloatA == False else 2 - аналогичная первому выражению запись тернарного оператора: если isIntOrFloatA равняется False (если первый аргумент - не число), то выводим 1, иначе - 2.
Код:
def isInt(s): try: int(s) return True except ValueError: return False def isFloat(s): try: float(s) return True except ValueError: return False def sum(a, b): isIntA = isInt(a) isFloatA = isFloat(a) isIntB = isInt(b) isFloatB = isFloat(b) isIntOrFloatA = isIntA or isFloatA isIntOrFloatB = isIntB or isFloatB if isIntOrFloatA and isIntOrFloatB: return (int(a) if isIntA else float(a)) + (int(b) if isIntB else float(b)) else: if isIntOrFloatA ^ isIntOrFloatB: return "{}st argument is not a number".format(1 if isIntOrFloatA == False else 2) else: return "all arguments are not a numbers" a = input() b = input() print(sum(a, b))