#include #include #include // rand and srand for ex. 5 using namespace std; /* * Exercise 0 */ /* Floating point arithmetic */ double const FLOAT_EPSILON_FLOOR = 0.0001, FLOAT_EPSILON_CEIL = FLOAT_EPSILON_FLOOR * 9; bool eq(double a, double b) { return ((a - b) < 0.0 ? (b - a) : (a - b)) <= FLOAT_EPSILON_FLOOR; } bool lt(double a, double b) { return !eq(a, b) && (a - b) < FLOAT_EPSILON_CEIL; } bool mt(double a, double b) { return lt(b, a); } /* Planimetry */ double distanceBetweenPoints(int x1, int y1, int x2, int y2) { int sideA = x1 - x2, sideB = y1 - y2; return sqrt(sideA * sideA + sideB * sideB); // Pythagorean theorem } /* Exercise calculations */ void ex0() { // These should be precalculated, but this shows how they're found out // The coordinates of points B, C, D and E are some combination of positive and/or negative values of 2.828 float const CROSS_PNT = 2.828, SLOPE_B = CROSS_PNT / CROSS_PNT, SLOPE_C = -CROSS_PNT / -CROSS_PNT, SLOPE_D = -CROSS_PNT / CROSS_PNT, SLOPE_E = CROSS_PNT / -CROSS_PNT; double x, y; cin >> x >> y; if (eq(x, 0)) // if it's on the Y ordinate { cout << "On a line" << endl; } else if (lt(distanceBetweenPoints(0, 0, x, y), 4.0)) { double pointSlope = y / x; if (eq(x, -CROSS_PNT) || eq(x, CROSS_PNT) || eq(pointSlope, SLOPE_B) || eq(pointSlope, SLOPE_C) || eq(pointSlope, SLOPE_D) || eq(pointSlope, SLOPE_E)) { cout << "On a line" << endl; } else if ((mt(y, 0) || eq(y, 0)) && mt(x, 0)) // Check 1st quadrant { if (mt(pointSlope, SLOPE_B)) cout << "Inside green area!" << endl; else if (mt(x, CROSS_PNT)) cout << "Inside purple area!" << endl; else cout << "Inside yellow area!" << endl; } else if ((mt(y, 0) || eq(y, 0)) && lt(x, 0)) // Check 2nd quadrant { if (lt(pointSlope, SLOPE_D)) cout << "Inside red area!" << endl; else if (x > -CROSS_PNT) cout << "Inside pink area!" << endl; } else if (lt(y, 0) && lt(x, 0)) // Check 3rd quadrant { if (mt(pointSlope, SLOPE_C)) cout << "Inside blue area!" << endl; else if (mt(x, -CROSS_PNT)) cout << "Inside pink area!" << endl; } else // Check 4th quadrant { if (mt(pointSlope, SLOPE_E) && mt(x, CROSS_PNT)) cout << "Inside purple area!" << endl; else cout << "Inside yellow area!" << endl; } } else if ((lt(-2, x) && lt(x, 2)) && (lt(-6, y) && lt(y, -7))) // Outside circle and in rectangle { cout << "Inside grey area" << endl; } } /* * Exercise 1 */ double f(unsigned int k, int x) { double sum = x; for (unsigned int i = 2; i <= k; i++) { if (i & 1) sum = 3 * sum + 1; else sum /= 2; } return sum; } void ex1() { int x; cin >> x; cout << f(35, x) << endl; } /* * Exercise 2 */ void setMarmaladeType(int type, int *blueberryMarmalades, int *peachMarmalades, int *rosehipMarmalades) { if (type % 7 == 0) *blueberryMarmalades += 1; else if (type % 13 == 0) *peachMarmalades += 1; else if (type % 17 == 0) *rosehipMarmalades += 1; } void ex2() { int archiveLength; cin >> archiveLength; int blueberryMarmalades = 0, peachMarmalades = 0, rosehipMarmalades = 0; for (int i = 0, digit, countryDigits, typeDigits, type; i < archiveLength; i++) { cin >> digit; if (i % 8 == 0) // Reset at start of ID number { countryDigits = 1; typeDigits = type = 0; } else if (countryDigits < 3) { countryDigits++; } else if (typeDigits < 4) { typeDigits++; (type *= 10) += digit; } else if (typeDigits == 4) { setMarmaladeType(type, &blueberryMarmalades, &peachMarmalades, &rosehipMarmalades); } } cout << "Мармалад от боровинки: " << blueberryMarmalades << endl; cout << "Мармалад от праскови: " << peachMarmalades << endl; cout << "Шипков мармалад: " << rosehipMarmalades << endl; } /* * Exercise 4 */ bool isInteresting(int n) { int lastDigit; do { lastDigit = n % 10; n /= 10; if ((lastDigit & 1) == ((n % 10) & 1)) return false; } while (n != 0); return true; } int sumOfInterestingNumsBetween(int a, int b) { int sum = 0; for (int i = a; i <= b; i++) { if (isInteresting(i)) sum += i; } return sum; } void ex4() { int a, b; cin >> a >> b; cout << sumOfInterestingNumsBetween(a, b) << endl; } /* * Exercise 5 */ const int NUMBER_LENGTH = 4, N = 10; int genSecretNum() { // Initializes random seed (required for getting a random number on every program launch) // Taken from included reference: https://www.cplusplus.com/reference/cstdlib/rand#example srand (time(NULL)); int rnd = rand(), result = 0; for (int i = 0; i < NUMBER_LENGTH;) { if (rnd % 10 != 0) { (result *= 10) += rnd % 10; i++; } else if (rnd == 0) { rnd = rand(); } rnd /= 10; } return result; } bool digitInsideNum(int digit, int num) { while (num != 0) { if (digit == num % 10) return true; num /= 10; } return false; } void countBullsAndCows(int secretNum, int guess, int *bulls, int *cows) { *bulls = *cows = 0; // If our secret num can contain zeroes, this (and the corresponding checks) should be changed to some other digit int secretCows = 0, guessCows = 0; for (int i = 0; i < NUMBER_LENGTH; i++) { if (guess % 10 == secretNum % 10) { *bulls += 1; } else { (secretCows *= 10) += secretNum % 10; // Getting unique cows prevents the later cow loop from incrementing cows // multiple times when we have duplicate digits in secretNum and in guessCows if (!digitInsideNum(guess % 10, guessCows)) (guessCows *= 10) += guess % 10; } secretNum /= 10; guess /= 10; } while (secretCows != 0) { if (digitInsideNum(secretCows % 10, guessCows)) *cows += 1; secretCows /= 10; } } void playBullsAndCows() { int secNum = genSecretNum(), guess = 0, bulls = 0, cows = 0; for (int i = 0; i < N; i++) { cin >> guess; if (guess == secNum) { cout << "Позна!" << endl; return; } else { countBullsAndCows(secNum, guess, &bulls, &cows); cout << bulls << " бикове и " << cows << " крави" << endl; } } cout << "Не позна в определения брой ходове!" << endl; } void ex5() { playBullsAndCows(); } int main() { ex0(); }