15 KiB
Решения задач с КЗН (Файл: КЗН_ИНФОРМАТИКА_май 2023.docx)
№1. Найдите все пятизначные числа, которые при делении на 133 дают в остатке 125, а при делении на 134 дают в остатке 111.
Решение:
for i in range(10_000, 99_999):
if i % 133 == 125 and i % 134 == 111:
print(i)
№2. Натуральное число называется числом Армстронга, если сумма цифр числа, возведенных в N-ную степень (где N – количество цифр в числе) равна самому числу. Например, 153 = 1^3 + 5^3 + 3^3. Найдите все трёхзначные Армстронга.
Решение:
print("3-x значные числа Армстронга:")
for i in range(100, 999):
s = 0
n = i
while n > 0:
decimal = n%10
s += decimal**3
n //= 10
if s == i:
print(i)
№3. Натуральное число называется автоморфным, если оно равно последним цифрам своего квадрата. Например, 252 = 625. Напишите программу, которая получает натуральное число N и выводит на экран все автоморфные числа, не превосходящие N.
Решение:
print("Введите N:")
n = int(input())
for i in range(1, n):
num = str(i)
num2 = str(i**2)
if num2[-len(num)::] == num: # см. слайсы
print(f"{num}*{num}={num2}")
№4. Напишите программу, которая получает два целых числа A и B (0 < A < B) и выводит квадраты всех натуральных чисел в интервале от A до B.
Решение:
print("Введите два целых числа:")
a, b = input().split(" ")
a, b = int(a), int(b)
for i in range(a, b+1):
print(f"{i}*{i}={i**2}")
№5. Напишите программу, которая получает два целых числа и находит их произведение, не используя операцию умножения. Учтите, что числа могут быть отрицательными.
Пример:
Введите два числа:
10 -15
10*(-15)=-150
Решение:
print("Введите два целых числа:")
a, b = input().split(" ")
a, b = int(a), int(b)
if b == 0:
res = 0
else:
res = int( a/(1/b) )
if b >= 0:
print(f"{a}*{b}={res}")
else:
print(f"{a}*({b})={res}")
№6 (не будет на КЗН). Ввести натуральное число N и вычислить сумму всех чисел Фибоначчи, меньших N. Предусмотрите защиту от ввода отрицательного числа N.
Пример:
Введите число N:
10000
Сумма 17709
Решение:
n = int(input("Введите число N: "))
if n <= 0:
print("Программа принимает только натуральное число N")
exit(0)
f1, f2 = 1, 2
s = 0
while f1 < n:
s += f1
f1, f2 = f2, f1+f2
print("Сумма", s)
№7 (не будет на КЗН). Дано натуральное число n. Вычислить:
(1 + \frac {1} {1^2})*(1 + \frac {1} {2^2}) * ... * (1 + \frac {1} {n^2})
Решение:
n = int(input("Введите число N: "))
if n <= 0:
print("Программа принимает только натуральные числа N")
exit(0)
m = 1
for i in range(1, n+1):
m *= (1 + 1/i**2)
print(f"Произведение: {m}")
№8. Ввести натуральное число и найти сумму его цифр.
Пример:
Введите натуральное число:
12345
Сумма цифр 15.
Решение:
n = int(input("Введите число N: "))
s = 0
while n > 0:
digit = n % 10
s += digit
n //= 10
print("Сумма цифр", s)
№9. Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры, стоящие рядом.
Пример:
Введите натуральное число:
12342
Нет.
Пример:
Введите натуральное число:
12245
Да.
Решение:
n = input("Введите натуральное число: ")
for i in range(1, len(n)):
if n[i] == n[i-1]:
print("Да.")
break # Выходим из цикла
else: # Выполнится, если цикл завершился без break
print("Нет.")
№10. Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры (необязательно стоящие рядом).
Пример:
Введите натуральное число:
12342
Да.
Пример:
Введите натуральное число:
12345
Нет.
Решение:
n = input("Введите натуральное число: ")
digits = []
unique_digits = set()
for digit in n:
"""
Добавляем элементы в список digits и множество unique_digits.
Последнее содержит только уникальные элементы, в отличии от списка.
Следовательно, если есть повторяющиеся числа, значит количество элементов в списке
и множетсве будет различным.
"""
digits.append(digit)
unique_digits.add(digit)
if len(digits) != len(unique_digits):
print("Да.")
else:
print("Нет.")
Решение задач из файла Задания_олимпиады_инф.docx
1. Для детей решили вырезать разные геометрические фигуры: круг, треугольник, квадрат. Каждой фигуры по одной. Сколько останется бумаги по площади после обрезки. Считается, что все фигуры можно вырезать на листе бумаге размером AxB. Для каждой фигуры даны соответствующие параметры: для круга - радиус, для квадрата и треугольника равностороннего - длина стороны.
Формат ввода
В первой строке вводятся через пробел ввод два натуральных числа А и В - стороны листа. Далее в следующей строке через пробел вводятся три натуральных числа: радиус круга, сторона квадрата и сторона равностороннего треугольника соответственно. Все числа не превосходят 10^6.
Формат вывода
Выводится одно вещественное число с точностью до двух знаков после запятой - ответ на задачу.
Пример:
| Ввод | Вывод |
|---|---|
| 5 6 1 2 3 |
18.96 |
Решение:
from math import pi, sqrt
a, b = input().split(" ")
r, f, h = input().split(" ")
a, b, r, f, h = int(a), int(b), int(r), int(f), int(h)
paperSquare = a*b
rectSquare = f**2
circleSquare = r**2*pi
triangleSquare = (h**2*sqrt(3))/4
result = round(paperSquare-circleSquare-rectSquare-triangleSquare, 2)
print(result)
2. Красивое число делится на 7 и не содержит повторяющихся цифр, например, 21 - красивое число, а 77 - нет. Найти на заданном отрезке все красивые числа. Если таких чисел нет, то вывести сообщение "NO".
Формат ввода
Вводятся два натуральных числа: начало и конец отрезка. Все числа не превосходят 10^6.
Формат вывода
Если счастливые числа существуют, то вывести их через пробел, иначе - вывести сообщение "NO".
| Ввод | Вывод |
|---|---|
| 5 20 | 7 14 |
Решение:
a, b = input().split(" ")
a, b = int(a), int(b)
def isPrettyNumber(n):
digits = [i for i in str(n)]
unique_digits = set(digits)
return n % 7 == 0 and len(digits) == len(unique_digits)
existPrettyNumbers = False
for i in range(a, b+1):
if isPrettyNumber(i):
print(i, end=" ")
existPrettyNumbers = True
if not existPrettyNumbers:
print("NO")
else:
print()
3. Рыбаки поймали карпа, карася, ерша и т.д. Не все смогли выловить весь набор рыб. Каждому хочется отнести домой один и тот же комплект рыб. Смогут ли они это сделать, если собрать каждого вида рыб и разделить поровну? Учтите, что рыбы должны быть целыми.
Формат ввода
В первой строке вводится через пробел N количество рыбаков и P количество наименований рыб. Каждое число не превосходит 10 000. Далее в каждой N-ой строке записаны P чисел - количество рыб соответствующих наименований (от 0 до 10^9).
Формат вывода
На первой строке вывести "Yes", если это возможно и далее на второй строке соответствующее количество рыб каждого наименования через пробел. Если это не возможно, то вывести "No".
Пример:
| Ввод | Вывод |
|---|---|
| 3 2 12 6 0 8 3 1 |
Yes 5 5 |
Решение:
fishersmen, categories = input().split(" ")
fishersmen, categories = int(fishersmen), int(categories)
fish = [0 for _ in range(categories)] # Заполняем массив нулями
# [0, 0, 0, ... P]
for i in range(fishersmen):
# Ниже собираем сколько каждого вида рыбы поймал рыбак
# Это список вида [8, 4, 6, ... P]
collectedFish = input().split(" ")
# Ниже преобразуем каждый элемент списка из строки в число
collectedFish = [int(i) for i in collectedFish]
# Прибавляем количесво пойманной рыбы каждого вида к списку fish
for j, fishAmount in enumerate(collectedFish):
fish[j] += fishAmount
# Далее просто проверяем делится ли количество пойманной рыбы нацело
# на количество рыбаков
canDivide = True
for i in fish:
if i % fishersmen != 0:
canDivide = False
if canDivide:
print("Yes")
fishAmount = [str(i//fishersmen) for i in fish]
print(" ".join(fishAmount))
else:
print("No")
Теория
Определения
- Язык — средство кодирования; это система знаков и правил для записи и передачи информации.
- Код — правило, по которому сообщение преобразуется в цепочку знаков.
- Кодирование — представление информации в форме, пригодной для её хранения, передачи, автоматизированной обработки.
- Алфавит — это набор знаков, который используется в языке.
- Мощность алфавита — количество знаков в алфавите. Вычисляется по формуле
N=2^i - Естественные языки — языки на которых говорят люди.
- Формальные языки — язык в котором однозначно определяется значение каждого слова, а также правила построения предложения и предания смысла.
- Позиционная система счисления — система счисления, в которой значение цифры определяется её позицией в записи числа.
- Алфавит с.с. — используемый в ней набор цифр.
- Основание с. с. = N
- Разряд — позиция цифры в записи числа.
- Непозиционная с. с. — такая с. с., в которой значение цифры не зависит от её места в записи числа. Например, римская сс. (Для справки: L = 50, C = 100, D = 500, M = 1000).
Формулы
N = 2^i – мощность алфавита, где i - информационный вес символа
I = ki – информационный объём, где k - количество символов в тексте, i - информационный вес символа. Обычно i принимают за 8 бит, если он не определен в задаче.
Пример использования:
Задача 1: Сообщение, записанное буквами из 16-символьного алфавита,
содержит 9000 символов. Какой объем информации оно несет? Ответ
запишите в килобайтах.
Решение: Мощность алфавита из условий задачи равна 16, следовательно N = 2^4, откуда i = 4 (бит). Тогда I = ki = 9000*4 = 36000 бит = 4500 байт = 4.39453125 Кбайт.
Ответ: 4.39453125 Кбайт.