#include "rational.h" #include long gcd( long m, long n ) { long tmp; while ( m != 0 ) { tmp = m; m = n % m; n = tmp; } return n; } bool rational_init( rational_t *p_r, long num, long den ) { if ( den == 0 ) { return false; } else { // Eliminate any common denominator long div = gcd( num, den ); num /= div; den /= div; // Ensure the numerator is negative if ( den >= 0 ) { p_r->numerator = num; p_r->denominator = den; } else { p_r->numerator = -num; p_r->denominator = -den; } } } bool rational_multiply( rational_t *p_r, rational_t q ) { long div_1 = gcd( p_r->numerator, q.denominator ); long div_2 = gcd( p_r->denominator, q.numerator ); p_r->numerator /= div_1; p_r->numerator *= (q.numerator/div_2); p_r->denominator /= div_2; p_r->denominator *= (q.denominator/div_1); } // If the rational number is of the form num/1, print 'num'; // otherwise print 'num/den' int rational_printf( rational_t *p_r ) { if ( p_r->denominator == 1 ) { return printf( "%d", p_r->numerator ); } else { return printf( "%d/%d", p_r->numerator, p_r->denominator ); } }