diff options
added examples sem 5
7 files changed, 214 insertions, 0 deletions
| -rw-r--r-- | Sem. 5/README.md | 15 | ||||
| -rw-r--r-- | Sem. 5/Task 1.cpp | 58 | ||||
| -rw-r--r-- | Sem. 5/Task 2.cpp | 39 | ||||
| -rw-r--r-- | Sem. 5/Task 3.cpp | 27 | ||||
| -rw-r--r-- | Sem. 5/Task 4.cpp | 23 | ||||
| -rw-r--r-- | Sem. 5/Task 5.cpp | 33 | ||||
| -rw-r--r-- | Sem. 5/Task 6.cpp | 19 |
diff --git a/Sem. 5/README.md b/Sem. 5/README.md new file mode 100644 index 0000000..81e738e --- /dev/null +++ b/Sem. 5/README.md @@ -0,0 +1,15 @@ +**Задача 1:** Въвежда се неотрицателно число n. Да се провери дали n е просто. + +**Задача 2:** Въвежда се неотрицателно число n. Да се отпечата неговото разбиване на прости множители. +Вход: 288 Изход: 2^5 * 3^2 + +**Задача 3:** Въвежда се неотрицателно число n. Пресметнете n + 1, използвайки само цикли и побитови операции. + +**Задача 4:** Въвеждат се неотрицателни числа n и k. Пресметнете n + k, използвайки само цикли и побитови операции.** + +**Задача 5:** Въвеждат се неотрицателни числа n и k. Пресметнете n * k, използвайки само цикли и побитови операции. + +**Задача 6:** Всяко естествено число се представя по единствен начин като сума на **различни**(не се повтарят) степени на двойката. +Въвежда се естествено число n. Отпечатайте това разбиване на n. +Вход: 26, Изход: 2^1 + 2^3 + 2^4. +Вход: 15, Изход: 2^0 + 2^1 + 2^2 + 2^3
\ No newline at end of file diff --git a/Sem. 5/Task 1.cpp b/Sem. 5/Task 1.cpp new file mode 100644 index 0000000..20ca708 --- /dev/null +++ b/Sem. 5/Task 1.cpp @@ -0,0 +1,58 @@ +#include <iostream> +using namespace std; + +int main() +{ + unsigned int n; + cin >> n; + + //Решение 1: + bool isPrime1 = true; + for (int i = 2; i <= n - 1; i++) + { + if (n % i == 0) + isPrime1 = false; + } + cout << isPrime1 << endl; + // Решението работи. Но прави излишни проверки. Не е необходимо да търсим делител чак до n-1. + // Ако не намерим делител от корен(n), то няма да намерим и след корена. + + //Решение 2: + bool isPrime2 = true; + for (int i = 2; i <= sqrt(n); i++) + { + if (n % i == 0) + isPrime2 = false; + } + cout << isPrime2 << endl; + + // Решението пак работи. Но на всяка проверка i <= sqrt(n) пресмятаме корен(n), което е очевидно, че е излишно. + // Може да го сметнем веднъж и после да го ползваме. + + //Решение 3: + bool isPrime3 = true; + double temp = sqrt(n); + for (int i = 2; i <= temp; i++) + { + if (n % i == 0) + isPrime3 = false; + } + cout << isPrime3 << endl; + + // И това решение дава верен резултат. Но отново е възможно да прави излишни проверки. + // При въвеждане на числото 2000000, очевидно би било, че числото НЕ е просто, понеже се дели на 2. + // Но нашето решение ще продължи да търси делители, дори след като е видяло, че има такъв (в случая числото 2). + + //Финално решение: + bool isPrime4 = true; + double temp2 = sqrt(n); + for (int i = 2; i <= temp2; i++) + { + if (n % i == 0) + { + isPrime4 = false; + break; + } + } + cout << isPrime4 << endl; +}
\ No newline at end of file diff --git a/Sem. 5/Task 2.cpp b/Sem. 5/Task 2.cpp new file mode 100644 index 0000000..0f4408d --- /dev/null +++ b/Sem. 5/Task 2.cpp @@ -0,0 +1,39 @@ +#include <iostream> +using namespace std; + +int main() +{ + unsigned int n; + cin >> n; + + for (int i = 2; n != 1; i++) //Всички възможни делители (множители) на n 2,3,4,5,..., + { + // Проверяваме дали числото е просто (понеже ни интересуват само прости множители) + bool isPrime = true; + double temp = sqrt(i); + for (int j = 2; j <= temp; j++) + { + if (i % j == 0) + { + isPrime = false; + break; + } + } + + if (!isPrime) + continue; //Ако не е просто - не ни интересува това число. Преминаваме към следващото. + + // Щом сме стигнали тук, сме убедени, че i е просто число. + // Искаме да видим колко пъти i дели n. + + int pow = 0; + while (n % i == 0) + { + n /= i; + pow++; + } + + if (pow != 0) //Ако поне веднъж го е разделило - значи участва в разбиването на прости множители. + cout << i << "^" << pow << " "; + } +}
\ No newline at end of file diff --git a/Sem. 5/Task 3.cpp b/Sem. 5/Task 3.cpp new file mode 100644 index 0000000..6723ee2 --- /dev/null +++ b/Sem. 5/Task 3.cpp @@ -0,0 +1,27 @@ +#include <iostream> +using namespace std; + + +//Алгоритъмът за събиране с 1 в двоичен запис: +//От дясно на ляво - правим всички 1-ци на 0, докато не срещнем първата 0. +//Първата 0 я правим на 1. + +// 101001111 + 1 +// 101010000 +int main() +{ + unsigned int n; + cin >> n; + + int mask = 1; //Най-десният бит на маската е 1-ца. Всички други са 0-ли. + + + while ((n & mask) > 0) //Проверяваме дали текущия бит е 1-ца. (при първото влизане, проверяваме най-десния) + { + n ^= mask; // Правим го на 0 ( n = n ^ mask) + mask <<= 1; // Отместваме маската, за да проверим бит-а в ляво. (mask = mask << 1) + } + + //Открили сме първата 0. 1-цата е на точната позиция в маската. + n |= mask; // Правим на 1-цa (n = n | mask) +}
\ No newline at end of file diff --git a/Sem. 5/Task 4.cpp b/Sem. 5/Task 4.cpp new file mode 100644 index 0000000..3dd9d53 --- /dev/null +++ b/Sem. 5/Task 4.cpp @@ -0,0 +1,23 @@ +#include <iostream> +using namespace std; + +int main() +{ + unsigned int n, k; + cin >> n >> k; + + + //Прилагаме k пъти събиране на n с 1. + for (int i = 0; i < k; i++) + { + //Кодът от миналата задача - събираме n с 1. + int mask = 1; + while ((n & mask) > 0) + { + n ^= mask; + mask <<= 1; + } + n |= mask; + } + cout << n << endl; +}
\ No newline at end of file diff --git a/Sem. 5/Task 5.cpp b/Sem. 5/Task 5.cpp new file mode 100644 index 0000000..b11de99 --- /dev/null +++ b/Sem. 5/Task 5.cpp @@ -0,0 +1,33 @@ +#include <iostream> +using namespace std; + +int main() +{ + unsigned int n, k; + cin >> n >> k; + + //Смятаме n*k. n+n+n...+n (k пъти). + //Прилагаме кода от предишната задача k пъти + + + int result = 0; + + // Изпъллнява се k пъти. + for (int t = 0; t < k; t++) + { + + //Събира result с n + for (int i = 0; i < n; i++) + { + //Събираме result с 1. + int mask = 1; + while ((result & mask) > 0) + { + result ^= mask; + mask <<= 1; + } + result |= mask; + } + } + cout << result << endl; +}
\ No newline at end of file diff --git a/Sem. 5/Task 6.cpp b/Sem. 5/Task 6.cpp new file mode 100644 index 0000000..2360b61 --- /dev/null +++ b/Sem. 5/Task 6.cpp @@ -0,0 +1,19 @@ +#include <iostream> +using namespace std; + +int main() +{ + unsigned int n; + cin >> n; + + int currentPosition = 0; + while (n != 0) + { + if (n % 2 == 1) //проверка за последния бит + { + cout << "2^" << currentPosition << " "; + } + currentPosition++; + n >>= 1; // Вече предпоследният бит става последен. (n /=2); + } +}
\ No newline at end of file |
