// FracComplex.cpp
#include <iostream>
#include <cmath>
using namespace std;


class FracComplex {
	Fraction re;
	Fraction im;
public:
  FracComplex(Fraction re = 0, Fraction im = 0) : re(re), im(im) { }

  friend ostream& operator<<(ostream& os, const FracComplex& fracComplex) {
   	if (fracComplex.re == 0 && fracComplex.im == 0) return os << 0;
  	if (fracComplex.re != 0) {
  		os << fracComplex.re;
  		if (fracComplex.im == 0) return os;
  	  if (fracComplex.im == 1) return os << " + i";
  	  if (fracComplex.im == -1) return os << " - i";
  	  if (fracComplex.im > 0) os << " + ";
  	  if (fracComplex.im < 0) os << " - ";
  	}
  	else {
  	  if (fracComplex.im == 1) return os << "i";
  	  if (fracComplex.im == -1) return os << "-i";
  	  if (fracComplex.im < 0) os << "-";
  	}
  	return os << abs(fracComplex.im) << " *i";
  }
};
