// Fraction.h #include #include typedef struct { long long numerator; long long denominator; } Fraction; /// Default constructor, conversion constructor void Fraction_Fraction(Fraction* this); void Fraction_Fraction_ll(Fraction* this, long long numerator); void Fraction_Fraction_ll_ll(Fraction* this, long long numerator, long long denominator); bool Fraction_simplify(Fraction* this); void Fraction_read(Fraction* this); void Fraction_print(const Fraction* this); long long Fraction_gcd(Fraction* this); long long Fraction_gcd_ll_ll(long long a, long long b); Fraction Fraction_add_Fraction(const Fraction* this, const Fraction* other); // main.cpp int main() { Fraction fr1; Fraction_Fraction(&fr1); Fraction_read(&fr1); printf("%s", "fr1 = "); Fraction_print(&fr1); Fraction fr2; Fraction_Fraction(&fr2); printf("%s", "\nfr2 = "); Fraction_print(&fr2); Fraction fr3; Fraction_Fraction_ll_ll( &fr3, 2, 3 ); printf("%s", "\nfr3 = "); Fraction_print(&fr3); Fraction fr4; Fraction_Fraction_ll( &fr4, -5 ); printf("%s", "\nfr4 = "); Fraction_print(&fr4); Fraction fr5; Fraction_Fraction_ll( &fr5, -13 ); printf("%s", "\nfr5 = "); Fraction_print(&fr5); Fraction fr6; Fraction_Fraction_ll( &fr6, -13 ); printf("%s", "\nfr6 = "); Fraction_print(&fr6); Fraction fr7; { Fraction tmp; Fraction_Fraction_ll( &tmp, 27 ); fr7 = tmp; } printf("%s", "\nfr7 = "); Fraction_print(&fr7); Fraction sum = Fraction_add_Fraction(&fr1, &fr3); // fr1.add(fr3); printf("%s", "\nfr1 + fr3 = "); Fraction_print(&sum); printf("%c", '\n'); } // Fraction.cpp void Fraction_Fraction(Fraction* this) { this->numerator = 0; this->denominator = 1; Fraction_simplify(this); } void Fraction_Fraction_ll(Fraction* this, long long numerator) { this->numerator = numerator; this->denominator = 1; Fraction_simplify(this); } void Fraction_Fraction_ll_ll(Fraction* this, long long numerator, long long denominator) { this->numerator = numerator; this->denominator = denominator; Fraction_simplify(this); } bool Fraction_simplify(Fraction* this) { long long common = Fraction_gcd(this); this->numerator /= common; this->denominator /= common; if ( denominator < 0 ) { numerator *= -1; denominator *= -1; } return common > 1; } void Fraction_read(Fraction* this) { scanf("%lld", &this->numerator); scanf("%lld", &this->denominator); Fraction_simplify(this); } void Fraction_print(const Fraction* this) { printf("%lld", this->numerator); printf("%c", '/'); printf("%lld", this->denominator); } long long Fraction_gcd(Fraction* this) { return Fraction_gcd_ll_ll(this->numerator, this->denominator); } long long Fraction_gcd_ll_ll(long long a, long long b) { a = a >= 0 ? a : -a; b = b >= 0 ? b : -b; while ( b > 0 ) { long long t = b; b = a % b; a = t; } return a; } Fraction Fraction_add_Fraction(const Fraction* this, const Fraction* other) { Fraction anonymous; Fraction_Fraction_ll_ll( &anonymous, this->numerator * other->denominator + this->denominator * other->numerator , this->denominator * other->denominator); return anonymous; }