diff options
Added todays practice
1 files changed, 176 insertions, 0 deletions
| -rw-r--r-- | Year 1/Programming introduction/Practice-08.11.21.cpp | 176 |
diff --git a/Year 1/Programming introduction/Practice-08.11.21.cpp b/Year 1/Programming introduction/Practice-08.11.21.cpp new file mode 100644 index 0000000..134dcfa --- /dev/null +++ b/Year 1/Programming introduction/Practice-08.11.21.cpp @@ -0,0 +1,176 @@ +#include <iostream> + +using namespace std; + +/* Exercises: + * https://github.com/triffon/ip-2021-22/blob/master/practicum/6/week5/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8%20%D0%BF%D0%B5%D1%82%D0%B0%20%D1%81%D0%B5%D0%B4%D0%BC%D0%B8%D1%86%D0%B0.pdf + */ + +// Задача първа: +// Напишете функция, която приема малка буква и връща главна. + +char capitalize(char a) { + if (a >= 'A' && a <= 'Z') + return a; + return a - 32; // 32 = 'а' - 'А' +} + +void ex1() { + char a; + cin >> a; + + cout << capitalize(a) << endl; +} + +// Задача втора: +// Напишете функция, която приема 2 цели числа и пресмята най-големия им общ +// делител. Използвайте алгоритъм на евклид. + +int gcd(int a, int b) { + // Using Euclidean algorithm https://simple.wikipedia.org/wiki/Euclidean_algorithm#The_algorithm_as_an_enumerated_list + if (a < b) { + int tmp = a; + a = b; + b = tmp; + } + + while (b != 0) { + int r = a % b; + a = b; + b = r; + } + return a; +} + +void ex2() { + int a, b; + cin >> a >> b; + + cout << gcd(a, b) << endl; +} + +// Задача трета: +// Използвайки задача втора, намерете най - малкото общо кратно. + +int lcm(int a, int b) { + int numsGCD = gcd(a, b); + + return (a / numsGCD) * (b / numsGCD) * numsGCD; +} + +void ex3() { + int a, b; + cin >> a >> b; + + cout << lcm(a, b) << endl; +} + +// Задача четвърта: +// Напишете функция която приема две числа n и m и връща цифрата на m та +// позиция в числото n. +// Пример: +// Вход: 4210 3 +// Изход: 4 + +int mthDigit(int n, int m) { + for(int i = 0; i < m; i++) { + n /= 10; + } + return n % 10; +} + +void ex4() { + int n, m; + cin >> n >> m; + + cout << mthDigit(n, m) << endl; +} + +// Задача пета: +// Напишете функция, която приема число и връща 1 ако то има поне две повтарящи +// се цифри. Функцията връща 0 в противен случай. + +int repeatedNums(int a) { + for(int i = a % 10; a != 0; i = (a /= 10) % 10) { + for (int j = a / 10; j != 0; j /= 10) { + if (j % 10 == i) return 1; + } + } + return 0; +} + +void ex5() { + int a; + cin >> a; + + cout << repeatedNums(a) << endl; +} + +// Задача шеста: +// Напишете функция която приема цяло число n и извежда на стандартния изход +// всички наредени двойки (i, j) където 1 ≤ i,j ≤ n. + +void printDoubles(int n) { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) + cout << "(" << i << ", " << j << ")" << endl; + } +} + +void ex6() { + int n; + cin >> n; + + printDoubles(n); +} + +// Задача седма: +// Напишете функция която приема променлива цяло число и чете от стандартния +// вход стойности за нея, докато не бъде въведена стойност над 100. Променливата да +// се декларира и изведе в main(). + +void cinUntilMoreThan100(int *x) { + while(*x <= 100) + cin >> *x; +} + +void ex7() { // This function acts as our main + int x; + cinUntilMoreThan100(&x); + + cout << x << endl; +} + +// Задача осма: +// Да се изведат всички числа в интервала [a..b] за които сумата и произведението от +// цифрите им е равно. + +bool hasEqualSumMult(int a) { + int sum = 0, mult = 1; + while (a != 0) { + int digit = a % 10; + sum += digit; + mult *= digit; + a /= 10; + } + return sum == mult; +} + +void printEqualDigitSumMult(int a, int b) { + for (int i = a; i <= b; i++) { + if (hasEqualSumMult(i)) + cout << i << endl; + } +} + +void ex8() { + int a, b; + cin >> a >> b; + + printEqualDigitSumMult(a, b); +} + +int main() { + ex8(); +} + |
