diff options
feat(Week05): Add exercises and solutions
23 files changed, 894 insertions, 0 deletions
| -rw-r--r-- | Week05/Exercise01.cpp | 14 | ||||
| -rw-r--r-- | Week05/Exercise02.cpp | 16 | ||||
| -rw-r--r-- | Week05/Exercise03.cpp | 26 | ||||
| -rw-r--r-- | Week05/Exercise04.cpp | 20 | ||||
| -rw-r--r-- | Week05/Exercise05.cpp | 22 | ||||
| -rw-r--r-- | Week05/Exercise05_QuestionSolution.cpp | 25 | ||||
| -rw-r--r-- | Week05/Exercise06.cpp | 27 | ||||
| -rw-r--r-- | Week05/Exercise07.cpp | 19 | ||||
| -rw-r--r-- | Week05/Exercise08.cpp | 32 | ||||
| -rw-r--r-- | Week05/Exercise09.cpp | 25 | ||||
| -rw-r--r-- | Week05/Exercise10.cpp | 24 | ||||
| -rw-r--r-- | Week05/Exercise11.cpp | 22 | ||||
| -rw-r--r-- | Week05/Exercise12.cpp | 26 | ||||
| -rw-r--r-- | Week05/Exercise13.cpp | 23 | ||||
| -rw-r--r-- | Week05/Exercise14.cpp | 26 | ||||
| -rw-r--r-- | Week05/Exercise15.cpp | 16 | ||||
| -rw-r--r-- | Week05/Exercise16.cpp | 24 | ||||
| -rw-r--r-- | Week05/Exercise17.cpp | 33 | ||||
| -rw-r--r-- | Week05/Exercise18.cpp | 29 | ||||
| -rw-r--r-- | Week05/Exercise19.cpp | 30 | ||||
| -rw-r--r-- | Week05/Exercise20.cpp | 23 | ||||
| -rw-r--r-- | Week05/Exercise21.cpp | 21 | ||||
| -rw-r--r-- | Week05/README.md | 371 |
diff --git a/Week05/Exercise01.cpp b/Week05/Exercise01.cpp new file mode 100644 index 0000000..73c05cc --- /dev/null +++ b/Week05/Exercise01.cpp @@ -0,0 +1,14 @@ +#include <iostream> + +int main() { + float numbers[10]; + for (int i = 0; i < 10; i++) { + std::cin >> numbers[i]; + } + + for (int i = 9; i >= 0; i--) { + std::cout << numbers[i] << ' '; + } + + return 0; +} diff --git a/Week05/Exercise02.cpp b/Week05/Exercise02.cpp new file mode 100644 index 0000000..0fb1bb2 --- /dev/null +++ b/Week05/Exercise02.cpp @@ -0,0 +1,16 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 7; + + char letters[SIZE]; + for (int i = 0; i < SIZE; i++) { + std::cin >> letters[i]; + } + + for (int i = 0; i < SIZE; i++) { + std::cout << letters[(i + 4) % SIZE] << ' '; + } + + return 0; +} diff --git a/Week05/Exercise03.cpp b/Week05/Exercise03.cpp new file mode 100644 index 0000000..5c0dfcb --- /dev/null +++ b/Week05/Exercise03.cpp @@ -0,0 +1,26 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 14; + + unsigned int numbers[SIZE]; + for (int i = 0; i < SIZE; i++) { + std::cin >> numbers[i]; + } + + unsigned int largest = 0; + for (int i = 0; i < SIZE; i++) { + if (numbers[i] > largest) + largest = numbers[i]; + } + + unsigned int second_largest = largest; + for (int i = 0; i < SIZE; i++) { + if (numbers[i] < largest && (numbers[i] > second_largest || second_largest == largest)) + second_largest = numbers[i]; + } + + std::cout << second_largest; + + return 0; +} diff --git a/Week05/Exercise04.cpp b/Week05/Exercise04.cpp new file mode 100644 index 0000000..d7d4b1b --- /dev/null +++ b/Week05/Exercise04.cpp @@ -0,0 +1,20 @@ +#include <iostream> + +int main() { + unsigned int factorial_max, power; + std::cin >> factorial_max >> power; + + unsigned int factorial = 1; + for (unsigned int i = 1; i <= factorial_max; i++) { + factorial *= i; + } + + unsigned int to_power = 1; + for (unsigned int i = 1; i <= power; i++) { + to_power *= factorial; + } + + std::cout << to_power; + + return 0; +} diff --git a/Week05/Exercise05.cpp b/Week05/Exercise05.cpp new file mode 100644 index 0000000..9592bff --- /dev/null +++ b/Week05/Exercise05.cpp @@ -0,0 +1,22 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 18; + + int numbers[SIZE]; + for (int i = 0; i < SIZE; i++) { + std::cin >> numbers[i]; + } + + for (int i = 0; i < SIZE; i++) { + if (numbers[i] == 0) + std::cout << numbers[i] << ' '; + } + + for (int i = 0; i < SIZE; i++) { + if (numbers[i] != 0) + std::cout << numbers[i] << ' '; + } + + return 0; +} diff --git a/Week05/Exercise05_QuestionSolution.cpp b/Week05/Exercise05_QuestionSolution.cpp new file mode 100644 index 0000000..3714aeb --- /dev/null +++ b/Week05/Exercise05_QuestionSolution.cpp @@ -0,0 +1,25 @@ +#include <iostream> + +/* Отговорът е не, не са нужни масиви. */ + +int main() { + const unsigned int SIZE = 18; + + unsigned int zero_count = 0; + int number; + + for (int i = 0; i < SIZE; i++) { + std::cin >> number; + + if (number == 0) + zero_count++; + else + std::cout << number << ' '; + } + + for (int i = 0; i < zero_count; i++) { + std::cout << 0 << ' '; + } + + return 0; +} diff --git a/Week05/Exercise06.cpp b/Week05/Exercise06.cpp new file mode 100644 index 0000000..e418fa4 --- /dev/null +++ b/Week05/Exercise06.cpp @@ -0,0 +1,27 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 15; + + int current_number, prev_number; + unsigned int size_current_series = 1, size_longest_series = 0; + + std::cin >> prev_number; + for (int i = 1; i < SIZE; i++) { + std::cin >> current_number; + + if (prev_number > current_number) + size_current_series = 0; + + size_current_series++; + + if (size_current_series > size_longest_series) + size_longest_series = size_current_series; + + prev_number = current_number; + } + + std::cout << size_longest_series; + + return 0; +} diff --git a/Week05/Exercise07.cpp b/Week05/Exercise07.cpp new file mode 100644 index 0000000..350747b --- /dev/null +++ b/Week05/Exercise07.cpp @@ -0,0 +1,19 @@ +#include <iostream> + +int main() { + unsigned int number; + std::cin >> number; + + unsigned int sum = 0; + for (int div = 1; div < number; div++) { + if (number % div == 0) + sum += div; + } + + if (sum == number) + std::cout << "Perfect" << std::endl; + else + std::cout << "Not perfect" << std::endl; + + return 0; +} diff --git a/Week05/Exercise08.cpp b/Week05/Exercise08.cpp new file mode 100644 index 0000000..47fa376 --- /dev/null +++ b/Week05/Exercise08.cpp @@ -0,0 +1,32 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 10; + + /* Става по-елегантно ако използваме един масив */ + double row1[SIZE], row2[SIZE]; + for (int i = 0; i < SIZE; i++) { + std::cin >> row1[i]; + } + for (int i = 0; i < SIZE; i++) { + std::cin >> row2[i]; + } + + char operation; + std::cin >> operation; + + double result; + for (int i = 0; i < SIZE; i++) { + switch (operation) { + case '+': result = row1[i] + row2[i]; break; + case '-': result = row1[i] - row2[i]; break; + case '*': result = row1[i] * row2[i]; break; + case '/': result = row1[i] / row2[i]; break; + } + std::cout << result << ' '; + } + + std::cout << std::endl; + + return 0; +} diff --git a/Week05/Exercise09.cpp b/Week05/Exercise09.cpp new file mode 100644 index 0000000..adcd5b1 --- /dev/null +++ b/Week05/Exercise09.cpp @@ -0,0 +1,25 @@ +#include <iostream> + +int main() +{ + double z; + unsigned int n; + std::cin >> z >> n; + + double base = z - 1; + double sum = 0; + + for (unsigned int i = 1; i <= n; i++) { + double to_power = 1; + + for (unsigned j = 1; j <= i; j++) { + to_power *= base; + } + + sum += ((i + 1) % 2 ? -1.0 : 1.0) * to_power / i; + } + + std::cout << sum << std::endl; + + return 0; +} diff --git a/Week05/Exercise10.cpp b/Week05/Exercise10.cpp new file mode 100644 index 0000000..64fbb4a --- /dev/null +++ b/Week05/Exercise10.cpp @@ -0,0 +1,24 @@ +#include <iostream> + +int main() { + const unsigned int DIGITS = 8; + const unsigned int WEIGHTS[DIGITS] = { 8, 6, 4, 2, 3, 5, 9, 7 }; + + unsigned int serial_number; + std::cin >> serial_number; + + unsigned int sum = 0; + for (int i = DIGITS - 1; i >= 0; i--) { + sum += (serial_number % 10) * WEIGHTS[i]; + serial_number /= 10; + } + + unsigned int control_digit = 11 - sum % 11; + + if (control_digit == 10) control_digit = 0; + else if (control_digit == 11) control_digit = 5; + + std::cout << control_digit << std::endl; + + return 0; +} diff --git a/Week05/Exercise11.cpp b/Week05/Exercise11.cpp new file mode 100644 index 0000000..906734f --- /dev/null +++ b/Week05/Exercise11.cpp @@ -0,0 +1,22 @@ +#include <iostream> + +int main() { + unsigned int lucas_i = 2, lucas_j = 1; + unsigned int number; + std::cin >> number; + + while (number > 0) { + for (unsigned int i = 0; i < number; i++) { + unsigned int old = lucas_j; + lucas_j += lucas_i; + lucas_i = old; + } + + std::cout << lucas_i << ' '; + std::cin >> number; + } + + std::cout << lucas_i << std::endl; + + return 0; +} diff --git a/Week05/Exercise12.cpp b/Week05/Exercise12.cpp new file mode 100644 index 0000000..eac5f08 --- /dev/null +++ b/Week05/Exercise12.cpp @@ -0,0 +1,26 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 20; + + unsigned short indecies[SIZE]; + bool visited[SIZE]; + for (unsigned int i = 0; i < SIZE; i++) { + std::cin >> indecies[i]; + visited[i] = false; + } + + unsigned int current_index = 0, jumps = 0; + while (current_index != SIZE - 1 && !visited[current_index]) { + visited[current_index] = true; + current_index = indecies[current_index]; + jumps++; + } + + if (current_index != SIZE - 1) + std::cout << "Infinity" << std::endl; + else + std::cout << jumps << std::endl; + + return 0; +} diff --git a/Week05/Exercise13.cpp b/Week05/Exercise13.cpp new file mode 100644 index 0000000..cc43afe --- /dev/null +++ b/Week05/Exercise13.cpp @@ -0,0 +1,23 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 8; + + int numbers[SIZE]; + for (unsigned int i = 0; i < SIZE; i++) { + std::cin >> numbers[i]; + } + + int search; + std::cin >> search; + + unsigned int occurrences = 0; + for (unsigned int i = 0; i < SIZE; i++) { + if (numbers[i] == search) + occurrences++; + } + + std::cout << occurrences << std::endl; + + return 0; +} diff --git a/Week05/Exercise14.cpp b/Week05/Exercise14.cpp new file mode 100644 index 0000000..56c5d57 --- /dev/null +++ b/Week05/Exercise14.cpp @@ -0,0 +1,26 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 16; + + int numbers[SIZE]; + for (unsigned int i = 0; i < SIZE; i++) { + std::cin >> numbers[i]; + } + + for (unsigned int i = 0; i < SIZE; i++) { + if (numbers[i] % 2 == 0) + std::cout << numbers[i] << ' '; + } + + std::cout << std::endl; + + for (unsigned int i = 0; i < SIZE; i++) { + if (numbers[i] % 2 != 0) + std::cout << numbers[i] << ' '; + } + + std::cout << std::endl; + + return 0; +} diff --git a/Week05/Exercise15.cpp b/Week05/Exercise15.cpp new file mode 100644 index 0000000..6a874bc --- /dev/null +++ b/Week05/Exercise15.cpp @@ -0,0 +1,16 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 12; + + double numbers[SIZE]; + for (unsigned int i = 0; i < SIZE; i++) { + std::cin >> numbers[i]; + } + + for (unsigned int i = 0; i < SIZE / 2; i++) { + std::cout << numbers[i] << ' ' << numbers[SIZE - 1 - i] << std::endl; + } + + return 0; +} diff --git a/Week05/Exercise16.cpp b/Week05/Exercise16.cpp new file mode 100644 index 0000000..21652e5 --- /dev/null +++ b/Week05/Exercise16.cpp @@ -0,0 +1,24 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 5; + + int row1[SIZE], row2[SIZE]; + for (int i = 0; i < SIZE; i++) { + std::cin >> row1[i]; + } + for (int i = 0; i < SIZE; i++) { + std::cin >> row2[i]; + } + + for (int i = 0; i < SIZE * 2; i++) { + if (i % 2 == 0) + std::cout << row1[i / 2] << ' '; + else + std::cout << row2[(i - 1) / 2] << ' '; + } + + std::cout << std::endl; + + return 0; +} diff --git a/Week05/Exercise17.cpp b/Week05/Exercise17.cpp new file mode 100644 index 0000000..fce4b64 --- /dev/null +++ b/Week05/Exercise17.cpp @@ -0,0 +1,33 @@ +#include <iostream> + +int main() { + unsigned int number; + std::cin >> number; + + unsigned int number_length, number_copy = number; + + for (number_length = 0; number_copy != 0; number_length++) { + number_copy /= 10; + } + + unsigned int sum = 0; + number_copy = number; + + while (number_copy != 0) { + unsigned int to_power = 1, digit = number_copy % 10; + + for (unsigned int i = 0; i < number_length; i++) { + to_power *= digit; + } + + sum += to_power; + number_copy /= 10; + } + + if (number == sum) + std::cout << "Narcissistic" << std::endl; + else + std::cout << "Not narcissistic" << std::endl; + + return 0; +} diff --git a/Week05/Exercise18.cpp b/Week05/Exercise18.cpp new file mode 100644 index 0000000..2bda68c --- /dev/null +++ b/Week05/Exercise18.cpp @@ -0,0 +1,29 @@ +#include <iostream> + +int main() { + const unsigned int SIZE = 7; + + int numbers[SIZE]; + for (unsigned int i = 0; i < SIZE; i++) { + std::cin >> numbers[i]; + } + + int left_sum = 0, right_sum = 0; + for (unsigned int i = 1; i < SIZE; i++) { + right_sum += numbers[i]; + } + + unsigned int balance_index = 0; + while (balance_index < SIZE && left_sum != right_sum) { + left_sum += numbers[balance_index]; + balance_index++; + right_sum -= numbers[balance_index]; + } + + if (balance_index == SIZE) + std::cout << "No such index" << std::endl; + else + std::cout << balance_index << std::endl; + + return 0; +} diff --git a/Week05/Exercise19.cpp b/Week05/Exercise19.cpp new file mode 100644 index 0000000..baad3c7 --- /dev/null +++ b/Week05/Exercise19.cpp @@ -0,0 +1,30 @@ +#include <iostream> + +int main() +{ + double x; + unsigned int n; + std::cin >> x >> n; + + double sum = 0; + + for (unsigned int k = 0; k <= n; k++) { + unsigned int l = 2 * k + 1; + + double to_power = 1; + for (unsigned p = 1; p <= l; p++) { + to_power *= x; + } + + unsigned int fac = 1; + for (unsigned i = 1; i <= l; i++) { + fac *= i; + } + + sum += (k % 2 ? -1.0 : 1.0) * to_power / fac; + } + + std::cout << sum << std::endl; + + return 0; +} diff --git a/Week05/Exercise20.cpp b/Week05/Exercise20.cpp new file mode 100644 index 0000000..b44c0b3 --- /dev/null +++ b/Week05/Exercise20.cpp @@ -0,0 +1,23 @@ +#include <iostream> + +int main() { + unsigned int number; + std::cin >> number; + + unsigned int check_digit = number % 10; + number /= 10; + + unsigned int sum = 0, digit = 0; + for (unsigned int multiplier = 2; number != 0; multiplier = multiplier % 2 + 1, number /= 10) { + digit = (number % 10) * multiplier; + if (digit > 9) digit -= 9; + sum += digit; + } + + if ((10 - (sum % 10)) % 10 == check_digit) + std::cout << "Valid" << std::endl; + else + std::cout << "Invalid" << std::endl; + + return 0; +} diff --git a/Week05/Exercise21.cpp b/Week05/Exercise21.cpp new file mode 100644 index 0000000..1572372 --- /dev/null +++ b/Week05/Exercise21.cpp @@ -0,0 +1,21 @@ +#include <iostream> + +int main() { + unsigned int n; + std::cin >> n; + + unsigned long f1 = 1, f2 = 1, f3 = 1; + for (unsigned long i = 1; i <= 2 * n; i++) { + f1 *= i; + if (i <= n + 1) + f2 *= i; + if (i <= n) + f3 *= i; + } + + unsigned long catalan = f1 / (f2 * f3); + + std::cout << catalan << std::endl; + + return 0; +} diff --git a/Week05/README.md b/Week05/README.md new file mode 100644 index 0000000..3a0c9ce --- /dev/null +++ b/Week05/README.md @@ -0,0 +1,371 @@ +# Задачи + +<https://syndamia.com/teaching/upp-2025/week05/> + +> [!WARNING] +> Имайте предвид, че не всички задачи се решават с масиви! + +## За решаване + +### Задача 1 + +От входа получавате 10 реални числа. +Трябва да ги върнете в обратен ред. + +|Вход|Изход| +|---|---| +|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 + +От входа получавате 7 букви. +Трябва да изкарате буквите в същата последователност, обаче завъртяни надясно с 3 позиции. + +|Вход|Изход| +|---|---| +|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 + +От входа получавате 14 цели неотрицателни числа. +Трябва да изкарате второто най-голямо число. +Ако няма такова, просто изкарайте най-голямото. + +|Вход|Изход| +|---|---| +|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 + +От входа получавате две цели положителни числа. +Трябва да върнете [факториел](https://en.wikipedia.org/wiki/Factorial#Definition) от първото число, който факториел е повдигнат на степен второто число. + +Факториел на едно (неотрицателно цяло) число е умножението на всички цели числа от 1 до самото число включително. +Примерно, факториел от 5 е `1 * 2 * 3 * 4 * 5 = 120`. + +|Вход|Изход| +|---|---| +|5 1|120| +|5 2|14400| +|3 6|46656| +|4 3|13824| +|1 183|1| +|2 8|256| + +### Задача 5 + +От входа получавате 18 цели числа. +Трябва да изкарате същата поредица числа, обаче всички нули са в началото на редицата. + +|Вход|Изход| +|---|---| +|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 + +От входа получавате 15 цели числа. +Трябва да изкарате дължината на най-дългата последователност от числа, която е подредена в нарастващ ред. + +Последователност от числа, която съдържа еднакви числа, също се зачита за сортирана в нарастващ ред. + +|Вход|Изход| +|---|---| +|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 + +От входата получавате цяло неотрицателно число. +Върнете дали то е перфектно: дали е равно на сумата на всички свои делители, освен себе си. + +|Вход|Изход| +|---|---| +|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 + +От входа получавате две редици от по 10 реални числа (т.е. първите 10 числа са от първата редица, и вторите 10 числа образуват втората редица). +След това получавате знак - аритметича операция (`+`, `-`, `*`, `/`). + +Трябва да изпълните операцията върху всяка съответна двойка числа от двете редици и да върнете резултатите. + +|Вход|Изход| +|---|---| +|1 2 3 4 5 6 7 8 9 10<br> + 1 2 3 4 5 6 7 8 9 10<br> + +| +|2 4 6 8 10 12 14 16 18 20| +|4.5 -16 194.1 919.01 1000.11 -27 12 444 71 0<br> + 0 8 12 56 10 0 3 14 1 0<br> + /| +|inf -2 16.175 16.41 100.011 -inf 4 31.714 71 -nan| + +### Задача 9 + +От входа получавате реално число z между 0 (изключително) и 2 (включително), заедно с дължина n. + +Трябва да намерите стойността на логаритъм с основа ℯ ([Неперово число](https://en.wikipedia.org/wiki/E_%28mathematical_constant%29)) от това число, използвайки развитието по ред на Тейлър: + + + +като n определя колко елемента от реда да използвате. + +|Вход|Изход| +|---|---| +|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 + +От входа получавате цяло неотрицатено число с максимум 8 цифри. +Това число представлява сериен номер под [S10 стандарта за идентификационни номера на пратки](https://en.wikipedia.org/wiki/S10_%28UPU_standard%29). + +Трябва да пресметнете "контролната цифра" (check digit) на серийния номер. +Това става по следния начин: +.numbered +1. От ляво на дясно, трябва да умножите всяка цифра със съответната си "тежест": 8, 6, 4, 2, 3, 5, 9, 7 +2. Сумирате умножените цифри +3. Пресмятате контролната цифра по формулата: `11 - <сума> mod 11`, където + ако резултата е 10, цифрата е 0 и ако резултата е 11, цифрата е 5. + +|Вход|Изход| +|---|---| +|0|5| +|1|4| +|2|8| +|8|0| +|47312482|9| +|87654321|6| +|37153644|4| +|30159181|5| + +### Задача 11 + +От входа получавате цяло неотрицателно число. + +Изкарвате [числото на Лукас](https://en.wikipedia.org/wiki/Lucas_number) след толкова на брой позиции и ако числото =[не]= е било 0, приемаме ново число и повтаряте логиката. + +Тоест, ако първото число е n, тогава връщате `n`-тото число на Лукас.\n +Ако второто число е m, тогава връщате `n + m`-тото число на Лукас. +И така нататък. + +Числата на Лукас се определят по следния начин: + + + +*[Вашия вход и изход може да са смесени!]* + +|Вход|Изход| +|---|---| +|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 + +От входа получавате 20 цели числа, всяко от които е индекс на елемент в масива (т.е. всяко е между 0 и 19 включително). + +Започвайки от първия елемент, вземате числената му стойност като индекс и "отивате" на тази позиция в масива. +Аналогично, за текущия елемент, вземате числената стойност и индексирате. +Така продължавате, докато не стигнете до последния елемент, когато алгоритъма спира. + +Целта е да преброите колко пъти "скачате" между различни числа и да изкарате тази бройка. + +Ако се поражда цикъл (посетим някое число повече от един път), тогава трябва да изкарате "Infinity". + +|Вход|Изход| +|---|---| +|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 + +От входа получавате 8 цели числа. +След това получавате 9то цяло число. + +Трябва да върнете, сред 8те цели числа, колко често се среща 9тото. + +|Вход|Изход| +|---|---| +|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 + +От входа получавате 16 цели числа. +Трябва да изкарате, на два реда, първо всички четни числа и после всички нечетни. + +|Вход|Изход| +|---|---| +|1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16|2 4 6 8 10 12 14 16<br>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<br> + -961 871 657 -297 -5 -9 255| + +### Задача 15 + +От входа получавате 12 реални числа. +Трябва да върнете, на отделни редове, двойки числа от тази поредица: +.bulleted +- Първата двойка числа съдържа първото и последното число. +- Втората двойка има второто и пред-посленото число. +- И така нататък. + +|Вход|Изход| +|---|---| +|1 2 3 4 5 6 7 8 9 10 11 12| +|1 12<br> + 2 11<br> + 3 10<br> + 4 9<br> + 5 8<br> + 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<br> + 124.01 899.192<br> + -47 547.77<br> + 915.5 -568.5<br> + 31.99 58<br> + 769.89 505| + +### Задача 16 + +От входа получавате две редици от по 5 цели числа (т.е. първите 5 числа са част от първата редица и вторите 5 числа са част от втората). + +Трябва да изкарате една редица от числа, където двете редици са преплетени: първо имаме първото число от първата редица, след това първото число от втората редица, след това второто число от първата редица и така нататък. + +|Вход|Изход| +|---|---| +|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 + +От входа получавате цяло число в десетична бройна система. + +Трябва да изкарате дали то е [число на Армстронг](https://en.wikipedia.org/wiki/Narcissistic_number): число, което е равно на сумата на цифрите си, където всяка цифра е повдигната на степен, дължината на числото. + +|Вход|Изход| +|---|---| +|153|Narcissistic| +|5|Narcissistic| +|0|Narcissistic| +|10|Not narcissistic| +|407|Narcissistic| +|54748|Narcissistic| + +### Задача 18 + +От входа получавате 7 цели числа. + +Трябва да намерите индекса на равновесие: позиция сред числата, такава че сумата от първото число до индекса - 1 е равна на сумата на числата от индекса + 1 до последното число. + +Ако такаъв индекс не съществува, изкарате "No such index". + +|Вход|Изход| +|---|---| +|-7 1 5 2 -4 3 0|3| +|5 5 4 2 1 3 8|No such index| + +### Задача 19 + +От входа получавате две числа: реален ъгъл в радиани x и положителен максимален индекс n. + +Трябва да върнете стойността на синус от този ъгъл, използвайки реда на Тейлър: + + + +където n определя с колко елемента от реда да смятаме. + +|Вход|Изход| +|---|---| +|0 1|0| +|0.52359 15|0.499992| +|1.57079 15|0.998356| +|4.71238 5|-1.08189| + +### Задача 20 + +От входа получавате цяло положително число. +Трябва да валидирате това число използвайки [алгоритъма на Luhn](https://en.wikipedia.org/wiki/Luhn_algorithm): +.numbered +1. Най-дясната цифра е "цифра за проверка", тя трябва да бъде изкарана за после. +2. Започвайки от най-дясната цифра (от останалите цифри, т.е. втората най-дясна в числото), + трябва да умножите всяка втора цифра по две. + Ако цифрата стане по-голяма от 9, трябва да *[извадите]* 9. +3. Сумирате всички цифри (всички умножени и неумножени). +4. Проверявате дали цифрата за проверка е равна на `(10 - (сумa mod 10)) mod 10` + +Този алгоритъм се използва главно в проверката на номера на дебитни/кредитни карти. +Главната цел е да се засекат някои механични грешки при въвеждане на номера. + +|Вход|Изход| +|---|---| +|0|Valid| +|1|Invalid| +|1156|Valid| +|1337|Invalid| +|12345674|Valid| +|13245674|Invalid| + +### Задача 21 + +От входа получавате цяло неотрицателно число. +Трябва да върнете съответното по индекс [число на Каталан](https://en.wikipedia.org/wiki/Catalan_number). + +n-тото число на Каталан се дефинира по следния начин: + + + +Където `x!` е [факториел](https://en.wikipedia.org/wiki/Factorial#Definition) от x. +Припомняме, че факториел на едно число е умножението на всички цели числа от 1 до самото число включително. + +|Вход|Изход| +|---|---| +|0|1| +|1|1| +|2|2| +|5|42| +|9|4862| |
