/*
* mathlib.cpp
*
* Created on: Apr 1, 2012
* Author: dst
*/
#include
#include
#include
#include
using namespace std;
template T gcd(T a, T b) {
return b > 0 ? gcd(b, a % b) : a;
}
inline bool isPow2(int n) {
return n > 0 && (n & (n-1)) == 0;
}
inline vector getDigits(int n) {
vector digits;
if (n == 0) {
digits.push_back(0);
return digits;
}
// Loop till there's nothing left
while (n) {
int lastDigit = n % 10;
digits.push_back(lastDigit);
// Shift right the number
n /= 10;
}
reverse(digits.begin(), digits.end());
return digits;
}
//TODO n over k, prime numbers
// tests
inline void math() {
//gcd
assert(gcd(13, 7) == 1);
assert(gcd(21, 6) == 3);
assert(gcd(7, 21) == 7);
// isPow2
assert(isPow2(1));
assert(isPow2(2));
assert(isPow2(4));
assert(isPow2(8));
assert(!isPow2(-1));
assert(!isPow2(0));
assert(!isPow2(3));
assert(!isPow2(5));
assert(!isPow2(6));
// getDigits
vector digits123 = getDigits(123);
assert(digits123[0] == 1);
assert(digits123[1] == 2);
assert(digits123[2] == 3);
vector digits0 = getDigits(0);
assert(digits0[0] == 0);
// sqrt
assert(sqrt(9) == 3);
// power
assert(pow(2, 10) == 1024);
//TODO: check it
//assert(pow10(3) == 1000);
}