Files
gkl_test_week/README.md
2023-05-28 14:27:37 +07:00

267 lines
11 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Решения задач с КЗН (Файл: `КЗННФОРМАТИКАай 2023.docx`)
**№1.** Найдите все пятизначные числа, которые при делении на 133 дают в остатке 125, а при делении на 134 дают в остатке 111.
**Решение:**
```Python
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. Найдите все трёхзначные Армстронга.
**Решение:**
```Python
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.
**Решение:**
```Python
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.
**Решение:**
```Python
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
```
**Решение:**
```Python
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}")
```
<span style="color: red;"><b>№6</b></span> (не будет на КЗН). Ввести натуральное число N и вычислить сумму всех чисел Фибоначчи, меньших N. Предусмотрите защиту от ввода отрицательного числа N.
Пример:
```
Введите число N:
10000
Сумма 17709
```
**Решение:**
```Python
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)
```
<span style="color: red;"><b>№7</b></span> (не будет на КЗН). Дано натуральное число n. Вычислить:
$$
(1 + \frac {1} {1^2})*(1 + \frac {1} {2^2}) * ... * (1 + \frac {1} {n^2})
$$
**Решение:**
```Python
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.
```
**Решение:**
```Python
n = int(input("Введите число N: "))
s = 0
while n > 0:
digit = n % 10
s += digit
n //= 10
print("Сумма цифр", s)
```
**№9.** Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры, стоящие рядом.
Пример:
```
Введите натуральное число:
12342
Нет.
```
Пример:
```
Введите натуральное число:
12245
Да.
```
**Решение:**
```Python
n = input("Введите натуральное число: ")
for i in range(1, len(n)):
if n[i] == n[i-1]:
print("Да.")
break # Выходим из цикла
else: # Выполнится, если цикл завершился без break
print("Нет.")
```
**№10.** Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры (не обязательно стоящие рядом).
Пример:
```
Введите натуральное число:
12342
Да.
```
Пример:
```
Введите натуральное число:
12345
Нет.
```
**Решение:**
```Python
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<br>1 2 3 | 18.96 |
**Решение:**
```Python
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 |
**Решение:**
```Python
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<br>12 6<br>0 8<br>3 1 | Yes<br>5 5 |
**Решение:**
```Python
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")
```