Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 5
diff options
context:
space:
mode:
Commitf05726d51dd6c41c23c337c2d4b0324ad231dbc8 (patch)
Author
 Angeld55 <angel_dimitriev@abv.bg>
2020-11-13 20:45:46 +0200
Committer
 Angeld55 <angel_dimitriev@abv.bg>
2020-11-13 20:45:46 +0200
Filesce8ee1c313676689342299c4e96c3d199d00370e /Sem. 5
Introduction_to_programming_FMI-f05726d51dd6c41c23c337c2d4b0324ad231dbc8.tar
Introduction_to_programming_FMI-f05726d51dd6c41c23c337c2d4b0324ad231dbc8.tar.gz
Introduction_to_programming_FMI-f05726d51dd6c41c23c337c2d4b0324ad231dbc8.zip
Parent8f4b6b75fd57a34d33bb9dd17af305898a8da81e (diff)
added examples sem 5
7 files changed, 214 insertions, 0 deletions
-rw-r--r--Sem. 5/README.md15
-rw-r--r--Sem. 5/Task 1.cpp58
-rw-r--r--Sem. 5/Task 2.cpp39
-rw-r--r--Sem. 5/Task 3.cpp27
-rw-r--r--Sem. 5/Task 4.cpp23
-rw-r--r--Sem. 5/Task 5.cpp33
-rw-r--r--Sem. 5/Task 6.cpp19
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