diff options
Add Task&Solution
2 files changed, 176 insertions, 0 deletions
| -rw-r--r-- | pract_SI/Pract. 06/Hmw2_task4/README.md | 11 | ||||
| -rw-r--r-- | pract_SI/Pract. 06/Hmw2_task4/Solution.cpp | 165 |
diff --git a/pract_SI/Pract. 06/Hmw2_task4/README.md b/pract_SI/Pract. 06/Hmw2_task4/README.md new file mode 100644 index 0000000..0c0bd82 --- /dev/null +++ b/pract_SI/Pract. 06/Hmw2_task4/README.md @@ -0,0 +1,11 @@ +## Задача 4 - Домашна работа №2 +#### зимен семестър 2021/2022, спец. Софтуерно инженерство + +Да се напише програма, която приема като вход от клавиатурата две цели числа - n и k и отпечатва в конзолата минималния брой от описаните по-долу операции, които трябва да се приложат за да се получи k от n. +Валидните операции са: +-Добавяне на цифра в края на числото. +-Премахване на цифра от края на числото. +-Размяна на местата на две цифри в числото. + +*Вход: 1234 43215, Изход: 3* +*Вход: 987123 123, Изход: 6*
\ No newline at end of file diff --git a/pract_SI/Pract. 06/Hmw2_task4/Solution.cpp b/pract_SI/Pract. 06/Hmw2_task4/Solution.cpp new file mode 100644 index 0000000..2d4fc6a --- /dev/null +++ b/pract_SI/Pract. 06/Hmw2_task4/Solution.cpp @@ -0,0 +1,165 @@ +#include <iostream> +#include <vector> +#define TEN 10 +using namespace std; + +/* +Example input/output: + +44987434 +544847 +O: 8 + +129 +329 +O: 3 + +4332321 +4232331 +O: 1 + +987123 +123 +O: 6 + +77688988 +89675421 +O: 10 +*/ + +bool checkData(int&,int&); +vector<int> createVector(int); +void swap(int&, int&); +int contains(const vector<int>&,const int digit,const size_t); +int contains(const vector<int>&,const vector<int>&, const int digit,const size_t); +unsigned leastOperations(const int n,const int k) +{ + vector<int> nDigits = createVector(n); + vector<int> kDigits = createVector(k); + size_t numberOfOperations = NULL; + + for (size_t i = 0; i < kDigits.size(); i++) + { + while (contains(kDigits, nDigits[nDigits.size() - 1], i) == -1 && nDigits.size() > i) + { + nDigits.pop_back(); + numberOfOperations++; + } + + int containsDigit = contains(nDigits,kDigits, kDigits[i], i); + if (containsDigit == i) + continue; + else if (containsDigit != -1) + swap(nDigits[i], nDigits[containsDigit]); + else + { + nDigits.push_back(kDigits[i]); + + if (i != nDigits.size() - 1) + { + swap(nDigits[i], nDigits[nDigits.size() - 1]); + numberOfOperations++; + } + } + + numberOfOperations++; + } + + numberOfOperations += nDigits.size() - kDigits.size(); + return numberOfOperations; +} + +int main() +{ + while (true) + { + int n, k; + cin >> n >> k; + + if (checkData) + cout << leastOperations(n, k) << endl << endl; + } + +} + +bool checkData(int &n,int &k) +{ + if (n < NULL && k < NULL) + { + n *= -1; + k *= -1; + } + + return(n >= NULL && k >= NULL); +} + +vector<int> createVector(int number) +{ + vector<int> newVector; + + size_t powTen = 1; + while (powTen * TEN <= number) + powTen *= TEN; + + while (powTen > 0) + { + int digit = number / powTen; + newVector.push_back(digit); + number %= powTen; + powTen /= TEN; + } + + return newVector; +} + +void swap(int& f, int& s) +{ + int temp = f; + f = s; + s = temp; +} + +int contains(const vector<int> &v, int digit, size_t start) +{ + for (size_t i = start; i < v.size(); i++) + if (v[i] == digit) + return i; //return index + + return -1; +} + +int contains(const vector<int> &nDigits,const vector<int> &kDigits, int digit, size_t start) +{ + int index = -1; + bool firstOccurance = true; + bool conflict; + for (size_t i = start; i < nDigits.size(); i++) + { + conflict = false; + if (kDigits.size() > i) + { + if (nDigits[i] == kDigits[i] && nDigits[i] == digit) + { + conflict = true; + + if (firstOccurance) + { + if (start == i) + return index = i; + + index = i; + firstOccurance = false; + } + } + } + + if (nDigits[i] == digit && !conflict) + { + return index = i; + firstOccurance = false; + } + } + + return index; +} + |
