# Задачи - УПП, Седмица 5, 30.10.2025 'define expected-reading 14 min 'define created 26 October 2025 'define edited 01 November 2025 [$pagenav] GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] .warn Имайте предвид, че не всички задачи се решават с масиви! ## За решаване ### Задача 1 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise01.cpp Решение] От входа получавате 10 реални числа. Трябва да ги върнете в обратен ред. :table_2 |= Вход |= Изход |: 1 2 3 4 5 6 7 8 9 10 |: 10 9 8 7 6 5 4 3 2 1 |: 41.4 89.95 65 34.799 18.62 100.001 84.55 69.21 6 39.8 |: 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 Решение] От входа получавате 7 букви. Трябва да изкарате буквите в същата последователност, обаче завъртяни надясно с 3 позиции. :table_2 |= Вход |= Изход |: a b c d e f g |: e f g a b c d |: k l m l j l b |: j l b k l m l ### Задача 3 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise03.cpp Решение] От входа получавате 14 цели неотрицателни числа. Трябва да изкарате второто най-голямо число. Ако няма такова, просто изкарайте най-голямото. :table_2 |= Вход |= Изход |: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |: 13 |: 505 19 899 0 232 61 546 6 65 259 55 389 326 760 |: 760 |: 9 9 9 9 9 9 9 9 9 9 9 9 9 9 |: 9 ### Задача 4 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise04.cpp Решение] От входа получавате две цели положителни числа. Трябва да върнете [url https://en.wikipedia.org/wiki/Factorial#Definition факториел] от първото число, който факториел е повдигнат на степен второто число. Факториел на едно (неотрицателно цяло) число е умножението на всички цели числа от 1 до самото число включително. Примерно, факториел от 5 е `[1 * 2 * 3 * 4 * 5 = 120]`. :table_2 |= Вход |= Изход |: 5 1 |: 120 |: 5 2 |: 14400 |: 3 6 |: 46656 |: 4 3 |: 13824 |: 1 183 |: 1 |: 2 8 |: 256 ### Задача 5 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise05.cpp Решение] От входа получавате 18 цели числа. Трябва да изкарате същата поредица числа, обаче всички нули са в началото на редицата. :table_2 |= Вход |= Изход |: 1 0 0 2 3 4 0 5 0 6 0 0 0 7 8 0 9 0 |: 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 |: 0 839 643 42 -694 57 650 729 -434 0 35 155 176 873 40 0 658 0 |: 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 Решение] От входа получавате 15 цели числа. Трябва да изкарате дължината на най-дългата последователност от числа, която е подредена в нарастващ ред. Последователност от числа, която съдържа еднакви числа, също се зачита за сортирана в нарастващ ред. .note =[(01.11.2025)]= Поправен е изхода в първия пример, от 6 на 8. :table_2 |= Вход |= Изход |: 1 2 3 0 0 0 6 7 8 8 8 -3 -2 -1 0 |: 8 |: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 |: 15 |: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |: 15 |: 4 -4 4 -4 4 -4 4 -4 4 -4 4 -4 4 -4 4 |: 2 |: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 |: 1 |: -539 -118 -431 53 -151 -151 -82 -40 640 -47 347 -50 -100 -198 984 |: 5 ### Задача 7 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise07.cpp Решение] От входата получавате цяло неотрицателно число. Върнете дали то е перфектно: дали е равно на сумата на всички свои делители, освен себе си. :table_2 |= Вход |= Изход |: 6 |: Perfect |: 7 |: Not perfect |: 1337 |: Not perfect |: 27 |: Not perfect |: 28 |: Perfect |: 29 |: Not perfect |: 33550336 |: Perfect |: 496 |: Perfect |: 42 |: Not perfect |: 8128 |: Perfect ### Задача 8 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise08.cpp Решение] От входа получавате две редици от по 10 реални числа (т.е. първите 10 числа са от първата редица, и вторите 10 числа образуват втората редица). След това получавате знак - аритметича операция (`[+]`, `[-]`, `[*]`, `[/]`). Трябва да изпълните операцията върху всяка съответна двойка числа от двете редици и да върнете резултатите. :table_2 |= Вход |= Изход |: ``` 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 + |: 2 4 6 8 10 12 14 16 18 20 |: ``` 4.5 -16 194.1 919.01 1000.11 -27 12 444 71 0 0 8 12 56 10 0 3 14 1 0 / |: 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 Решение] От входа получавате реално число z между 0 (изключително) и 2 (включително), заедно с дължина n. Трябва да намерите стойността на логаритъм с основа ℯ ([url https://en.wikipedia.org/wiki/E_(mathematical_constant) Неперово число]) от това число, използвайки развитието по ред на Тейлър: [image ./img/ln_taylor_series.png] като n определя колко елемента от реда да използвате. :table_2 |= Вход |= Изход |: 1 1 |: 0 |: 1.5 1 |: 0.5 |: 1.5 3 |: 0.416667 |: 1.5 9 |: 0.405532 |: 1.5 20 |: 0.405465 |: 0.5 1 |: -0.5 |: 0.5 5 |: -0.688542 |: 0.5 20 |: -0.693147 |: 0.01 20 |: -3.40687 |: 0.01 900 |: -4.60516 |: 0.01 1000 |: -4.60517 ### Задача 10 .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 стандарта за идентификационни номера на пратки]. Трябва да пресметнете "контролната цифра" (check digit) на серийния номер. Това става по следния начин: .numbered 1. От ляво на дясно, трябва да умножите всяка цифра със съответната си "тежест": 8, 6, 4, 2, 3, 5, 9, 7 2. Сумирате умножените цифри 3. Пресмятате контролната цифра по формулата: `[11 - <сума> mod 11]`, където ако резултата е 10, цифрата е 0 и ако резултата е 11, цифрата е 5. :table_2 |= Вход |= Изход |: 0 |: 5 |: 1 |: 4 |: 2 |: 8 |: 8 |: 0 |: 47312482 |: 9 |: 87654321 |: 6 |: 37153644 |: 4 |: 30159181 |: 5 ### Задача 11 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise11.cpp Решение] От входа получавате цяло неотрицателно число. Изкарвате [url https://en.wikipedia.org/wiki/Lucas_number числото на Лукас] след толкова на брой позиции и ако числото =[не]= е било 0, приемаме ново число и повтаряте логиката. Тоест, ако първото число е n, тогава връщате `[n]`-тото число на Лукас.\n Ако второто число е m, тогава връщате `[n + m]`-тото число на Лукас. И така нататък. Числата на Лукас се определят по следния начин: [image ./img/lucas_def.png] .note =[(01.11.2025)]= Входа на последния пример е поправен. *[Вашия вход и изход може да са смесени!]* :table_2 |= Вход |= Изход |: 0 |: 2 |: 1 0 |: 1 1 |: 2 0 |: 3 3 |: 5 0 |: 11 11 |: 2 3 0 |: 3 11 11 |: 8 8 1 0 |: 47 2207 3571 3571 ### Задача 12 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise12.cpp Решение] От входа получавате 20 цели числа, всяко от които е индекс на елемент в масива (т.е. всяко е между 0 и 19 включително). Започвайки от първия елемент, вземате числената му стойност като индекс и "отивате" на тази позиция в масива. Аналогично, за текущия елемент, вземате числената стойност и индексирате. Така продължавате, докато не стигнете до последния елемент, когато алгоритъма спира. Целта е да преброите колко пъти "скачате" между различни числа и да изкарате тази бройка. Ако се поражда цикъл (посетим някое число повече от един път), тогава трябва да изкарате "Infinity". .note =[(01.11.2025)]= Входа на първия пример е поправен. :table_2 |= Вход |= Изход |: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 |: 19 |: 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |: 1 |: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |: Infinity |: 5 3 18 19 12 2 7 14 17 16 19 13 11 6 9 19 3 1 8 1 |: 8 |: 4 3 18 9 12 2 7 14 17 16 19 13 11 6 9 19 3 1 8 1 |: Infinity ## За самоподготовка ### Задача 13 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise13.cpp Решение] От входа получавате 8 цели числа. След това получавате 9то цяло число. Трябва да върнете, сред 8те цели числа, колко често се среща 9тото. :table_2 |= Вход |= Изход |: 1 2 3 4 5 6 7 8 9 |: 0 |: 1 2 1 -3 2 -4 3 5 1 |: 2 |: 8 1 7 8 8 1 7 -3 8 |: 3 |: 0 0 0 0 0 0 0 0 0 |: 8 ### Задача 14 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise14.cpp Решение] От входа получавате 16 цели числа. Трябва да изкарате, на два реда, първо всички четни числа и после всички нечетни. :table_2 |= Вход |= Изход |: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |: ``` 2 4 6 8 10 12 14 16 1 3 5 7 9 11 13 15 |: -961 -46 86 871 657 96 -40 -297 -754 468 -5 662 -9 -392 82 255 |: ``` -46 86 96 -40 -754 468 662 -392 82 -961 871 657 -297 -5 -9 255 ### Задача 15 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise15.cpp Решение] От входа получавате 12 реални числа. Трябва да върнете, на отделни редове, двойки числа от тази поредица: .bulleted - Първата двойка числа съдържа първото и последното число. - Втората двойка има второто и пред-посленото число. - И така нататък. :table_2 |= Вход |= Изход |: 1 2 3 4 5 6 7 8 9 10 11 12 |: ``` 1 12 2 11 3 10 4 9 5 8 6 7 |: 419.8 124.01 -47 915.5 31.99 769.89 505 58 -568.5 547.77 899.192 52 |: ``` 419.8 52 124.01 899.192 -47 547.77 915.5 -568.5 31.99 58 769.89 505 ### Задача 16 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise16.cpp Решение] От входа получавате две редици от по 5 цели числа (т.е. първите 5 числа са част от първата редица и вторите 5 числа са част от втората). Трябва да изкарате една редица от числа, където двете редици са преплетени: първо имаме първото число от първата редица, след това първото число от втората редица, след това второто число от първата редица и така нататък. :table_2 |= Вход |= Изход |: 1 2 3 4 5 6 7 8 9 10 |: 1 6 2 7 3 8 4 9 5 10 |: 0 1 0 1 0 1 0 1 0 1 |: 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 Решение] От входа получавате цяло число в десетична бройна система. Трябва да изкарате дали то е [url https://en.wikipedia.org/wiki/Narcissistic_number число на Армстронг]: число, което е равно на сумата на цифрите си, където всяка цифра е повдигната на степен, дължината на числото. :table_2 |= Вход |= Изход |: 153 |: Narcissistic |: 5 |: Narcissistic |: 0 |: Narcissistic |: 10 |: Not narcissistic |: 407 |: Narcissistic |: 54748 |: Narcissistic ### Задача 18 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise18.cpp Решение] .note =[(01.11.2025)]= Поправени бройката на входните цели числа и втория пример. От входа получавате 7 цели числа. Трябва да намерите индекса на равновесие: позиция сред числата, такава че сумата от първото число до индекса - 1 е равна на сумата на числата от индекса + 1 до последното число. Ако такаъв индекс не съществува, изкарате "No such index". :table_2 |= Вход |= Изход |: -7 1 5 2 -4 3 0 |: 3 |: 5 5 4 2 1 3 8 |: No such index ### Задача 19 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise19.cpp Решение] От входа получавате две числа: реален ъгъл в радиани x и положителен максимален индекс n. Трябва да върнете стойността на синус от този ъгъл, използвайки реда на Тейлър: [image ./img/sinx_taylor_series.png] където n определя с колко елемента от реда да смятаме. :table_2 |= Вход |= Изход |: 0 1 |: 0 |: 0.52359 15 |: 0.499992 |: 1.57079 15 |: 0.998356 |: 4.71238 5 |: -1.08189 ### Задача 20 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise20.cpp Решение] От входа получавате цяло положително число. Трябва да валидирате това число използвайки [url https://en.wikipedia.org/wiki/Luhn_algorithm алгоритъма на Luhn]: .numbered 1. Най-дясната цифра е "цифра за проверка", тя трябва да бъде изкарана за после. 2. Започвайки от най-дясната цифра (от останалите цифри, т.е. втората най-дясна в числото), трябва да умножите всяка втора цифра по две. Ако цифрата стане по-голяма от 9, трябва да *[извадите]* 9. 3. Сумирате всички цифри (всички умножени и неумножени). 4. Проверявате дали цифрата за проверка е равна на `[(10 - (сумa mod 10)) mod 10]` Този алгоритъм се използва главно в проверката на номера на дебитни/кредитни карти. Главната цел е да се засекат някои механични грешки при въвеждане на номера. .note =[(01.11.2025)]= Поправен е входа на третия пример. :table_2 |= Вход |= Изход |: 0 |: Valid |: 1 |: Invalid |: 1156 |: Valid |: 1337 |: Invalid |: 12345674 |: Valid |: 13245674 |: Invalid ### Задача 21 .solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise21.cpp Решение] От входа получавате цяло неотрицателно число. Трябва да върнете съответното по индекс [url https://en.wikipedia.org/wiki/Catalan_number число на Каталан]. n-тото число на Каталан се дефинира по следния начин: [image ./img/catalan_def.png] Където `[x!]` е [url https://en.wikipedia.org/wiki/Factorial#Definition факториел] от x. Припомняме, че факториел на едно число е умножението на всички цели числа от 1 до самото число включително. :table_2 |= Вход |= Изход |: 0 |: 1 |: 1 |: 1 |: 2 |: 2 |: 5 |: 42 |: 9 |: 4862