#include <stdio.h>
#include <string>
class Complex {
private:
int a, b;
public:
Complex(int real) {
a = real;
b = 0;
}
Complex(int real, int imag) {
a = real;
b = imag;
}
Complex(const Complex &c) {
*this = c;
}
Complex &operator=(const Complex &c) {
a = c.a;
b = c.b;
return *this;
}
Complex &operator+=(const Complex &c) {
a += c.a;
b += c.b;
return *this;
}
Complex &operator-=(const Complex &c) {
a -= c.a;
b -= c.b;
return *this;
}
Complex &operator*=(const Complex &c) {
Complex tmp = *this;
a = tmp.a * c.a - tmp.b * c.b;
b = tmp.a * c.b + tmp.b * c.a;
return *this;
}
std::string str() const {
char buf[32];
if (b == 0) {
snprintf(buf, sizeof(buf), "%d", a);
} else if (a == 0) {
if (b == -1) return "-i";
if (b == 1) return "i";
snprintf(buf, sizeof(buf), "%di", b);
} else if (b == -1) {
snprintf(buf, sizeof(buf), "%d-i", a);
} else if (b < 0) {
snprintf(buf, sizeof(buf), "%d%di", a, b);
} else if (b == 1) {
snprintf(buf, sizeof(buf), "%d+i", a);
} else {
snprintf(buf, sizeof(buf), "%d+%di", a, b);
}
return buf;
}
};
Complex operator+(const Complex &c1, const Complex &c2) {
Complex ret = c1;
ret += c2;
return ret;
}
Complex operator-(const Complex &c1, const Complex &c2) {
Complex ret = c1;
ret -= c2;
return ret;
}
Complex operator*(const Complex &c1, const Complex &c2) {
Complex ret = c1;
ret *= c2;
return ret;
}
int main() {
Complex i(0, 1);
Complex a = 1 + 2*i;
Complex b = 3 + 4*i;
Complex c = a + b;
Complex d = a * b;
Complex e = a - 1;
Complex f = a - 2*i;
printf("a = %s\n", a.str().c_str());
printf("b = %s\n", b.str().c_str());
printf("c = %s\n", c.str().c_str());
printf("d = %s\n", d.str().c_str());
printf("e = %s\n", e.str().c_str());
printf("f = %s\n", f.str().c_str());
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmc+CgpjbGFzcyBDb21wbGV4IHsKcHJpdmF0ZToKICAgIGludCBhLCBiOwoKcHVibGljOgogICAgQ29tcGxleChpbnQgcmVhbCkgewogICAgICAgIGEgPSByZWFsOwogICAgICAgIGIgPSAwOwogICAgfQoKICAgIENvbXBsZXgoaW50IHJlYWwsIGludCBpbWFnKSB7CiAgICAgICAgYSA9IHJlYWw7CiAgICAgICAgYiA9IGltYWc7CiAgICB9CgogICAgQ29tcGxleChjb25zdCBDb21wbGV4ICZjKSB7CiAgICAgICAgKnRoaXMgPSBjOwogICAgfQoKICAgIENvbXBsZXggJm9wZXJhdG9yPShjb25zdCBDb21wbGV4ICZjKSB7CiAgICAgICAgYSA9IGMuYTsKICAgICAgICBiID0gYy5iOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBDb21wbGV4ICZvcGVyYXRvcis9KGNvbnN0IENvbXBsZXggJmMpIHsKICAgICAgICBhICs9IGMuYTsKICAgICAgICBiICs9IGMuYjsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgQ29tcGxleCAmb3BlcmF0b3ItPShjb25zdCBDb21wbGV4ICZjKSB7CiAgICAgICAgYSAtPSBjLmE7CiAgICAgICAgYiAtPSBjLmI7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIENvbXBsZXggJm9wZXJhdG9yKj0oY29uc3QgQ29tcGxleCAmYykgewogICAgICAgIENvbXBsZXggdG1wID0gKnRoaXM7CiAgICAgICAgYSA9IHRtcC5hICogYy5hIC0gdG1wLmIgKiBjLmI7CiAgICAgICAgYiA9IHRtcC5hICogYy5iICsgdG1wLmIgKiBjLmE7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0IHsKICAgICAgICBjaGFyIGJ1ZlszMl07CiAgICAgICAgaWYgKGIgPT0gMCkgewogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBhKTsKICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewogICAgICAgICAgICBpZiAoYiA9PSAtMSkgcmV0dXJuICItaSI7CiAgICAgICAgICAgIGlmIChiID09ICAxKSByZXR1cm4gICJpIjsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkaSIsIGIpOwogICAgICAgIH0gZWxzZSBpZiAoYiA9PSAtMSkgewogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQtaSIsIGEpOwogICAgICAgIH0gZWxzZSBpZiAoYiA8IDApIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkJWRpIiwgYSwgYik7CiAgICAgICAgfSBlbHNlIGlmIChiID09IDEpIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkK2kiLCBhKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQrJWRpIiwgYSwgYik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBidWY7CiAgICB9Cn07CgpDb21wbGV4IG9wZXJhdG9yKyhjb25zdCBDb21wbGV4ICZjMSwgY29uc3QgQ29tcGxleCAmYzIpIHsKICAgIENvbXBsZXggcmV0ID0gYzE7CiAgICByZXQgKz0gYzI7CiAgICByZXR1cm4gcmV0Owp9CgpDb21wbGV4IG9wZXJhdG9yLShjb25zdCBDb21wbGV4ICZjMSwgY29uc3QgQ29tcGxleCAmYzIpIHsKICAgIENvbXBsZXggcmV0ID0gYzE7CiAgICByZXQgLT0gYzI7CiAgICByZXR1cm4gcmV0Owp9CgpDb21wbGV4IG9wZXJhdG9yKihjb25zdCBDb21wbGV4ICZjMSwgY29uc3QgQ29tcGxleCAmYzIpIHsKICAgIENvbXBsZXggcmV0ID0gYzE7CiAgICByZXQgKj0gYzI7CiAgICByZXR1cm4gcmV0Owp9CgppbnQgbWFpbigpIHsKICAgIENvbXBsZXggaSgwLCAxKTsKICAgIENvbXBsZXggYSA9IDEgKyAyKmk7CiAgICBDb21wbGV4IGIgPSAzICsgNCppOwogICAgQ29tcGxleCBjID0gYSArIGI7CiAgICBDb21wbGV4IGQgPSBhICogYjsKICAgIENvbXBsZXggZSA9IGEgLSAxOwogICAgQ29tcGxleCBmID0gYSAtIDIqaTsKICAgIHByaW50ZigiYSA9ICVzXG4iLCBhLnN0cigpLmNfc3RyKCkpOwogICAgcHJpbnRmKCJiID0gJXNcbiIsIGIuc3RyKCkuY19zdHIoKSk7CiAgICBwcmludGYoImMgPSAlc1xuIiwgYy5zdHIoKS5jX3N0cigpKTsKICAgIHByaW50ZigiZCA9ICVzXG4iLCBkLnN0cigpLmNfc3RyKCkpOwogICAgcHJpbnRmKCJlID0gJXNcbiIsIGUuc3RyKCkuY19zdHIoKSk7CiAgICBwcmludGYoImYgPSAlc1xuIiwgZi5zdHIoKS5jX3N0cigpKTsKfQo=