2023-05-28 14:27:37 +07:00
2023-05-28 14:27:37 +07:00

Решения задач с КЗН (Файл: КЗННФОРМАТИКАай 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 = 13 + 53 + 33. Найдите все трёхзначные Армстронга.
Решение:

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. Для каждой фигуры даны соответствующие параметры: для круга - радиус, для квадрата и треугольника равностороннего - длина стороны.
Пример:

Ввод Вывод
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".

Ввод Вывод
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 до 109).
####### Формат вывода На первой строке вывести "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")
Description
Задания с КЗН
Readme 164 KiB
Languages
Markdown 100%