diff options
1 files changed, 113 insertions, 72 deletions
| -rw-r--r-- | src/teaching/upp-2025/week05/index.du | 185 |
diff --git a/src/teaching/upp-2025/week05/index.du b/src/teaching/upp-2025/week05/index.du index f19ff04..6e545e7 100644 --- a/src/teaching/upp-2025/week05/index.du +++ b/src/teaching/upp-2025/week05/index.du @@ -1,9 +1,9 @@ -# Задачи - УПП, Седмица 5, 30.10.2025 +'def title Задачи - УПП, Седмица 5, 30.10.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 14 min -'define created 26 October 2025 -'define edited 01 November 2025 -[$pagenav] +# {title} + +{pagenav 14 min;26 October 2025;01 November 2025} GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] @@ -14,12 +14,13 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise01.cpp} От входа получавате 10 реални числа. Трябва да ги върнете в обратен ред. -:table_2 +:table +:2 |= Вход |= Изход @@ -30,14 +31,16 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 39.8 6 69.21 84.55 100.001 18.62 34.799 65 89.95 41.4 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise02.cpp} От входа получавате 7 букви. Трябва да изкарате буквите в същата последователност, обаче завъртяни надясно с 3 позиции. -:table_2 +:table +:2 |= Вход |= Изход @@ -48,15 +51,17 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: j l b k l m l + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise03.cpp} От входа получавате 14 цели неотрицателни числа. Трябва да изкарате второто най-голямо число. Ако няма такова, просто изкарайте най-голямото. -:table_2 +:table +:2 |= Вход |= Изход @@ -70,17 +75,19 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 9 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise04.cpp} От входа получавате две цели положителни числа. -Трябва да върнете [url https://en.wikipedia.org/wiki/Factorial#Definition факториел] от първото число, който факториел е повдигнат на степен второто число. +Трябва да върнете {url факториел;https://en.wikipedia.org/wiki/Factorial#Definition} от първото число, който факториел е повдигнат на степен второто число. Факториел на едно (неотрицателно цяло) число е умножението на всички цели числа от 1 до самото число включително. -Примерно, факториел от 5 е [`1 * 2 * 3 * 4 * 5 = 120`]. +Примерно, факториел от 5 е {` 1 * 2 * 3 * 4 * 5 = 120}. -:table_2 +:table +:2 |= Вход |= Изход @@ -103,14 +110,16 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 256 + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise05.cpp} От входа получавате 18 цели числа. Трябва да изкарате същата поредица числа, обаче всички нули са в началото на редицата. -:table_2 +:table +:2 |= Вход |= Изход @@ -121,12 +130,13 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 0 0 0 0 839 643 42 -694 57 650 729 -434 35 155 176 873 40 658 + .question Нужни ли са масиви, ако в условието трябваше да изкарвате нулите в края на поредицата? ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise06.cpp} От входа получавате 15 цели числа. Трябва да изкарате дължината на най-дългата последователност от числа, която е подредена в нарастващ ред. @@ -134,9 +144,10 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] Последователност от числа, която съдържа еднакви числа, също се зачита за сортирана в нарастващ ред. .note -[=(01.11.2025)=] Поправен е изхода в първия пример, от 6 на 8. +{b (01.11.2025)} Поправен е изхода в първия пример, от 6 на 8. -:table_2 +:table +:2 |= Вход |= Изход @@ -159,14 +170,16 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 5 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise07.cpp} От входата получавате цяло неотрицателно число. Върнете дали то е перфектно: дали е равно на сумата на всички свои делители, освен себе си. -:table_2 +:table +:2 |= Вход |= Изход @@ -201,16 +214,18 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: Perfect + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise08.cpp} От входа получавате две редици от по 10 реални числа (т.е. първите 10 числа са от първата редица, и вторите 10 числа образуват втората редица). -След това получавате знак - аритметича операция ([`+`], [`-`], [`*`], [`/`]). +След това получавате знак - аритметича операция ({` +}, {` -}, {` *}, {` /}). Трябва да изпълните операцията върху всяка съответна двойка числа от двете редици и да върнете резултатите. -:table_2 +:table +:2 |= Вход |= Изход @@ -231,19 +246,21 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: inf -2 16.175 16.41 100.011 -inf 4 31.714 71 -nan + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise09.cpp} От входа получавате реално число z между 0 (изключително) и 2 (включително), заедно с дължина n. -Трябва да намерите стойността на логаритъм с основа ℯ ([url https://en.wikipedia.org/wiki/E_(mathematical_constant) Неперово число]) от това число, използвайки развитието по ред на Тейлър: +Трябва да намерите стойността на логаритъм с основа ℯ ({url Неперово число;https://en.wikipedia.org/wiki/E_(mathematical_constant)}) от това число, използвайки развитието по ред на Тейлър: -[image ./img/ln_taylor_series.png] +{img ./img/ln_taylor_series.png} като n определя колко елемента от реда да използвате. -:table_2 +:table +:2 |= Вход |= Изход @@ -281,22 +298,24 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: -4.60517 + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise10.cpp} От входа получавате цяло неотрицатено число с максимум 8 цифри. -Това число представлява сериен номер под [url https://en.wikipedia.org/wiki/S10_(UPU_standard) S10 стандарта за идентификационни номера на пратки]. +Това число представлява сериен номер под {url S10 стандарта за идентификационни номера на пратки;https://en.wikipedia.org/wiki/S10_(UPU_standard)}. Трябва да пресметнете "контролната цифра" (check digit) на серийния номер. Това става по следния начин: .numbered 1. От ляво на дясно, трябва да умножите всяка цифра със съответната си "тежест": 8, 6, 4, 2, 3, 5, 9, 7 2. Сумирате умножените цифри -3. Пресмятате контролната цифра по формулата: [`11 - <сума> mod 11`], където +3. Пресмятате контролната цифра по формулата: {` 11 - <сума> mod 11}, където ако резултата е 10, цифрата е 0 и ако резултата е 11, цифрата е 5. -:table_2 +:table +:2 |= Вход |= Изход @@ -325,28 +344,30 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 5 + ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise11.cpp} От входа получавате цяло неотрицателно число. -Изкарвате [url https://en.wikipedia.org/wiki/Lucas_number числото на Лукас] след толкова на брой позиции и ако числото [=не=] е било 0, приемаме ново число и повтаряте логиката. +Изкарвате {url числото на Лукас;https://en.wikipedia.org/wiki/Lucas_number} след толкова на брой позиции и ако числото {b не} е било 0, приемаме ново число и повтаряте логиката. -Тоест, ако първото число е n, тогава връщате [`n`]-тото число на Лукас.\n -Ако второто число е m, тогава връщате [`n + m`]-тото число на Лукас. +Тоест, ако първото число е n, тогава връщате {` n}-тото число на Лукас.\n +Ако второто число е m, тогава връщате {` n + m}-тото число на Лукас. И така нататък. Числата на Лукас се определят по следния начин: -[image ./img/lucas_def.png] +{img ./img/lucas_def.png} .note -[=(01.11.2025)=] Входа на последния пример е поправен. +{b (01.11.2025)} Входа на последния пример е поправен. -[*Вашия вход и изход може да са смесени!*] +{i Вашия вход и изход може да са смесени!} -:table_2 +:table +:2 |= Вход |= Изход @@ -369,9 +390,10 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 47 2207 3571 3571 + ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise12.cpp} От входа получавате 20 цели числа, всяко от които е индекс на елемент в масива (т.е. всяко е между 0 и 19 включително). @@ -384,9 +406,10 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] Ако се поражда цикъл (посетим някое число повече от един път), тогава трябва да изкарате "Infinity". .note -[=(01.11.2025)=] Входа на първия пример е поправен. +{b (01.11.2025)} Входа на първия пример е поправен. -:table_2 +:table +:2 |= Вход |= Изход @@ -406,18 +429,20 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: Infinity + ## За самоподготовка ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise13.cpp} От входа получавате 8 цели числа. След това получавате 9то цяло число. Трябва да върнете, сред 8те цели числа, колко често се среща 9тото. -:table_2 +:table +:2 |= Вход |= Изход @@ -434,14 +459,16 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 8 + ### Задача 14 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise14.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise14.cpp} От входа получавате 16 цели числа. Трябва да изкарате, на два реда, първо всички четни числа и после всички нечетни. -:table_2 +:table +:2 |= Вход |= Изход @@ -458,9 +485,10 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] -961 871 657 -297 -5 -9 255 + ### Задача 15 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise15.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise15.cpp} От входа получавате 12 реални числа. Трябва да върнете, на отделни редове, двойки числа от тази поредица: @@ -469,7 +497,8 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] - Втората двойка има второто и пред-посленото число. - И така нататък. -:table_2 +:table +:2 |= Вход |= Изход @@ -494,15 +523,17 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] 769.89 505 + ### Задача 16 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise16.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise16.cpp} От входа получавате две редици от по 5 цели числа (т.е. първите 5 числа са част от първата редица и вторите 5 числа са част от втората). Трябва да изкарате една редица от числа, където двете редици са преплетени: първо имаме първото число от първата редица, след това първото число от втората редица, след това второто число от първата редица и така нататък. -:table_2 +:table +:2 |= Вход |= Изход @@ -513,15 +544,17 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 0 1 1 0 0 1 1 0 0 1 + ### Задача 17 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise17.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise17.cpp} От входа получавате цяло число в десетична бройна система. -Трябва да изкарате дали то е [url https://en.wikipedia.org/wiki/Narcissistic_number число на Армстронг]: число, което е равно на сумата на цифрите си, където всяка цифра е повдигната на степен, дължината на числото. +Трябва да изкарате дали то е {url число на Армстронг;https://en.wikipedia.org/wiki/Narcissistic_number}: число, което е равно на сумата на цифрите си, където всяка цифра е повдигната на степен, дължината на числото. -:table_2 +:table +:2 |= Вход |= Изход @@ -544,12 +577,13 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: Narcissistic + ### Задача 18 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise18.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise18.cpp} .note -[=(01.11.2025)=] Поправени бройката на входните цели числа и втория пример. +{b (01.11.2025)} Поправени бройката на входните цели числа и втория пример. От входа получавате 7 цели числа. @@ -557,7 +591,8 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] Ако такаъв индекс не съществува, изкарате "No such index". -:table_2 +:table +:2 |= Вход |= Изход @@ -568,19 +603,21 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: No such index + ### Задача 19 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise19.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise19.cpp} От входа получавате две числа: реален ъгъл в радиани x и положителен максимален индекс n. Трябва да върнете стойността на синус от този ъгъл, използвайки реда на Тейлър: -[image ./img/sinx_taylor_series.png] +{img ./img/sinx_taylor_series.png} където n определя с колко елемента от реда да смятаме. -:table_2 +:table +:2 |= Вход |= Изход @@ -597,27 +634,29 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: -1.08189 + ### Задача 20 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise20.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise20.cpp} От входа получавате цяло положително число. -Трябва да валидирате това число използвайки [url https://en.wikipedia.org/wiki/Luhn_algorithm алгоритъма на Luhn]: +Трябва да валидирате това число използвайки {url алгоритъма на Luhn;https://en.wikipedia.org/wiki/Luhn_algorithm}: .numbered 1. Най-дясната цифра е "цифра за проверка", тя трябва да бъде изкарана за после. 2. Започвайки от най-дясната цифра (от останалите цифри, т.е. втората най-дясна в числото), трябва да умножите всяка втора цифра по две. - Ако цифрата стане по-голяма от 9, трябва да [*извадите*] 9. + Ако цифрата стане по-голяма от 9, трябва да {i извадите} 9. 3. Сумирате всички цифри (всички умножени и неумножени). -4. Проверявате дали цифрата за проверка е равна на [`(10 - (сумa mod 10)) mod 10`] +4. Проверявате дали цифрата за проверка е равна на {` (10 - (сумa mod 10)) mod 10} Този алгоритъм се използва главно в проверката на номера на дебитни/кредитни карти. Главната цел е да се засекат някои механични грешки при въвеждане на номера. .note -[=(01.11.2025)=] Поправен е входа на третия пример. +{b (01.11.2025)} Поправен е входа на третия пример. -:table_2 +:table +:2 |= Вход |= Изход @@ -640,21 +679,23 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: Invalid + ### Задача 21 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise21.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise21.cpp} От входа получавате цяло неотрицателно число. -Трябва да върнете съответното по индекс [url https://en.wikipedia.org/wiki/Catalan_number число на Каталан]. +Трябва да върнете съответното по индекс {url число на Каталан;https://en.wikipedia.org/wiki/Catalan_number}. n-тото число на Каталан се дефинира по следния начин: -[image ./img/catalan_def.png] +{img ./img/catalan_def.png} -Където [`x!`] е [url https://en.wikipedia.org/wiki/Factorial#Definition факториел] от x. +Където {` x!} е {url факториел;https://en.wikipedia.org/wiki/Factorial#Definition} от x. Припомняме, че факториел на едно число е умножението на всички цели числа от 1 до самото число включително. -:table_2 +:table +:2 |= Вход |= Изход |