Skip to content

Instantly share code, notes, and snippets.

@ramntry
Last active August 29, 2015 14:08
Show Gist options
  • Select an option

  • Save ramntry/f9a8a5d74e5c7708022a to your computer and use it in GitHub Desktop.

Select an option

Save ramntry/f9a8a5d74e5c7708022a to your computer and use it in GitHub Desktop.
#include <iostream>
#include <iomanip>
typedef long long integral;
struct num {
integral const z;
integral const s;
num(integral const z, integral const s) : z(z), s(s) {}
num(integral const z) : z(z), s(0) {}
num() : z(0), s(0) {}
num(integral const z, num const b) : z(z), s(b.s) {}
num(num const a, integral const s) : z(a.z), s(s) {}
};
static inline num operator "" _s(unsigned long long const s) { return num(0, s); }
static inline num operator *(num const a, num const b) {
return num(a.z * b.z - 5 * a.s * b.s,
a.z * b.s + a.s * (b.z + b.s));
}
static inline num operator +(num const a, num const b) {
return num(a.z + b.z, a.s + b.s);
}
static inline num operator -(num const a, num const b) {
return num(a.z - b.z, a.s - b.s);
}
static inline num operator -(num const a) {
return num(-a.z, -a.s);
}
static inline std::ostream &operator <<(std::ostream &out, num const a) {
if (a.s == 0) {
return out << a.z;
}
if (a.z == 0) {
return out << a.s << 's';
}
return out << a.z << std::setiosflags(std::ios::showpos)
<< a.s << 's'
<< std::resetiosflags(std::ios::showpos);
}
static inline num sqr(num const a) { return a * a; }
int main() {
std::cout << (num(2, 3) + num(100_s - 1, 2) * num(3, -1_s)) << std::endl;
std::cout << (2 * -(4 - 5_s) - 7) << std::endl;
std::cout << (sqr(2_s) - 4_s) << std::endl;
std::cout << 0_s << std::endl;
std::cout << 10_s << std::endl;
std::cout << -1_s << std::endl;
std::cout << (5 - 1_s) << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment