分数的运算
#include <cstdio>
#include <cmath>
struct fraction
{
int up;
int down;
} ;
int gcd ( int a, int b)
{
return b ? gcd ( b, a % b) : a;
}
fraction reduction ( fraction result)
{
if ( result. down < 0 )
{
result. up = - result. up;
result. down = - result. down;
}
if ( result. up == 0 )
result. down = 1 ;
else
{
int d = gcd ( abs ( result. up) , abs ( result. down) ) ;
result. up / = d;
result. down / = d;
}
return result;
}
fraction add ( fraction f1, fraction f2)
{
fraction result;
result. up = f1. up * f2. down + f2. up * f1. down;
result. down = f1. down * f2. down;
return reduction ( result) ;
}
fraction sub ( fraction f1, fraction f2)
{
fraction result;
result. up = f1. up * f2. down - f2. up * f1. down;
result. down = f1. down * f2. down;
return reduction ( result) ;
}
fraction mul ( fraction f1, fraction f2)
{
fraction result;
result. up = f1. up * f2. up;
result. down = f1. down * f2. down;
return reduction ( result) ;
}
fraction div ( fraction f1, fraction f2)
{
fraction result;
result. up = f1. up * f2. down;
result. down = f1. down * f2. up;
return reduction ( result) ;
}
void print ( fraction result)
{
if ( result. down == 1 ) printf ( "%d\n" , result. up) ;
else if ( result. up == result. down) printf ( "1\n" ) ;
else if ( result. up > result. down) printf ( "%d %d %d\n" , result. up / result. down, abs ( result. up) % result. down, result. down) ;
else printf ( "%d %d\n" , result. up, result. down) ;
}
int main ( )
{
fraction a, b;
while ( scanf_s ( "%d%d%d%d" , & a. up, & a. down, & b. up, & b. down) != EOF )
{
print ( add ( a, b) ) ;
print ( sub ( a, b) ) ;
print ( mul ( a, b) ) ;
print ( div ( a, b) ) ;
}
return 0 ;
}