Files
gkl_test_week/README.md
2023-05-28 22:51:25 +07:00

299 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
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 = $ 1^3 + 5^3 + 3^3 $. Найдите все трёхзначные Армстронга.
**Решение:**
```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. Для каждой фигуры даны соответствующие параметры: для круга - радиус, для квадрата и треугольника равностороннего - длина стороны.
##### Формат ввода
В первой строке вводятся через пробел ввод два натуральных числа А и В - стороны листа. Далее в следующей строке через пробел вводятся три натуральных числа: радиус круга, сторона квадрата и сторона равностороннего треугольника соответственно. Все числа не превосходят $10^6$.
##### Формат вывода
Выводится одно вещественное число с точностью до двух знаков после запятой - ответ на задачу.
##### Пример:
| Ввод | Вывод |
| ------ | ------ |
| 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".
###### Формат ввода
Вводятся два натуральных числа: начало и конец отрезка. Все числа не превосходят $10^6$.
###### Формат вывода
Если счастливые числа существуют, то вывести их через пробел, иначе - вывести сообщение "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 до $10^9$).
###### Формат вывода
На первой строке вывести "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")
```
## Теория
#### Определения
* Язык &mdash; средство кодирования; это система знаков и правил для записи и передачи информации.
* Код &mdash; правило, по которому сообщение преобразуется в цепочку знаков.
* Кодирование &mdash; представление информации в форме, пригодной для её хранения, передачи, автоматизированной обработки.
* Алфавит &mdash; это набор знаков, который используется в языке.
* Мощность алфавита &mdash; количество знаков в алфавите. Вычисляется по формуле $N=2^i$
* Естественные языки &mdash; языки на которых говорят люди.
* Формальные языки &mdash; язык в котором однозначно определяется значение каждого слова, а также правила построения предложения и предания смысла.
* Позиционная система счисления &mdash; система счисления, в которой значение цифры определяется её позицией в записи числа.
* Алфавит с.с. &mdash; используемый в ней набор цифр.
* Основание с. с. = N
* Разряд &mdash; позиция цифры в записи числа.
* Непозиционная с. с. &mdash; такая с. с., в которой значение цифры не зависит от её места в записи числа. Например, римская сс. (Для справки: L = 50, C = 100, D = 500, M = 1000).
#### Формулы
$N = 2^i$ &ndash; мощность алфавита, где i - информационный вес символа
$I = ki$ &ndash; информационный объём, где k - количество символов в тексте, i - информационный вес символа. Обычно i принимают за 8 бит, если он не определен в задаче.
Пример использования:
**Задача 1**: Сообщение, записанное буквами из 16-символьного алфавита,
содержит 9000 символов. Какой объем информации оно несет? Ответ
запишите в килобайтах.
**Решение**: Мощность алфавита из условий задачи равна 16, следовательно $N = 2^4$, откуда $i = 4$ (бит). Тогда $I = ki = 9000*4$ = 36000 бит = 4500 байт = 4.39453125 Кбайт.
**Ответ**: 4.39453125 Кбайт.