写在前面
实现思路
化简、约分函数(重点) 加、减、乘、除四则运算分拆分子、分母进行 化简、约分计算结果 根据不同运算法则,打印等式结果 注意事项
整型*整型,可能会达到long long
,使用int
会出现数据溢出问题(测试点问题
) 最大公约数,分子分母绝对值公约数 题目实现较复杂,有难度
测试用例
input:
2 / 3 - 4 / 2
output:
2 / 3 + ( - 2 ) = ( - 1 1 / 3 )
2 / 3 - ( - 2 ) = 2 2 / 3
2 / 3 * ( - 2 ) = ( - 1 1 / 3 )
2 / 3 / ( - 2 ) = ( - 1 / 3 )
input:
5 / 3 0 / 6
output:
1 2 / 3 + 0 = 1 2 / 3
1 2 / 3 - 0 = 1 2 / 3
1 2 / 3 * 0 = 0
1 2 / 3 / 0 = Inf
ac代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd ( ll a, ll b)
{
return b== 0 ? a : gcd ( b, a% b) ;
}
struct Fraction
{
ll up, down;
} a, b;
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 minu ( 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 multi ( Fraction f1, Fraction f2)
{
Fraction result;
result. up = f1. up* f2. up;
result. down = f1. down* f2. down;
return reduction ( result) ;
}
Fraction divide ( Fraction f1, Fraction f2)
{
Fraction result;
result. up = f1. up* f2. down;
result. down = f1. down* f2. up;
return reduction ( result) ;
}
void showResult ( Fraction r)
{
r = reduction ( r) ;
if ( r. up< 0 ) printf ( "(" ) ;
if ( r. down== 1 ) printf ( "%lld" , r. up) ;
else if ( abs ( r. up) > r. down)
{
printf ( "%lld %lld/%lld" , r. up/ r. down, abs ( r. up) % r. down, r. down) ;
}
else
{
printf ( "%lld/%lld" , r. up, r. down) ;
}
if ( r. up< 0 ) printf ( ")" ) ;
}
int main ( )
{
scanf ( "%lld/%lld %lld/%lld" , & a. up, & a. down, & b. up, & b. down) ;
showResult ( a) ;
printf ( " + " ) ;
showResult ( b) ;
printf ( " = " ) ;
showResult ( add ( a, b) ) ;
printf ( "\n" ) ;
showResult ( a) ;
printf ( " - " ) ;
showResult ( b) ;
printf ( " = " ) ;
showResult ( minu ( a, b) ) ;
printf ( "\n" ) ;
showResult ( a) ;
printf ( " * " ) ;
showResult ( b) ;
printf ( " = " ) ;
showResult ( multi ( a, b) ) ;
printf ( "\n" ) ;
showResult ( a) ;
printf ( " / " ) ;
showResult ( b) ;
printf ( " = " ) ;
if ( b. up == 0 ) printf ( "Inf" ) ;
else showResult ( divide ( a, b) ) ;
return 0 ;
}
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd ( ll a, ll b)
{
return b== 0 ? a : gcd ( b, a% b) ;
}
struct Fraction
{
ll up, down;
Fraction ( ll la, ll lb)
{
up= la;
down= lb;
}
~ Fraction ( ) { } ;
} a ( 0 , 0 ) , b ( 0 , 0 ) ;
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;
}
void showResult ( Fraction r)
{
r = reduction ( r) ;
if ( r. up< 0 ) printf ( "(" ) ;
if ( r. down== 1 ) printf ( "%lld" , r. up) ;
else if ( abs ( r. up) > r. down) printf ( "%lld %lld/%lld" , r. up/ r. down, abs ( r. up) % r. down, r. down) ;
else printf ( "%lld/%lld" , r. up, r. down) ;
if ( r. up< 0 ) printf ( ")" ) ;
}
int main ( )
{
scanf ( "%lld/%lld %lld/%lld" , & a. up, & a. down, & b. up, & b. down) ;
showResult ( a) ;
printf ( " + " ) ;
showResult ( b) ;
printf ( " = " ) ;
Fraction result ( a. up* b. down + b. up* a. down, a. down* b. down) ,
result2 ( a. up* b. down - b. up* a. down, a. down* b. down) ,
result3 ( a. up* b. up, a. down* b. down) ,
result4 ( a. up* b. down, a. down* b. up) ;
showResult ( reduction ( result) ) ;
printf ( "\n" ) ;
showResult ( a) ;
printf ( " - " ) ;
showResult ( b) ;
printf ( " = " ) ;
showResult ( reduction ( result2) ) ;
printf ( "\n" ) ;
showResult ( a) ;
printf ( " * " ) ;
showResult ( b) ;
printf ( " = " ) ;
showResult ( reduction ( result3) ) ;
printf ( "\n" ) ;
showResult ( a) ;
printf ( " / " ) ;
showResult ( b) ;
printf ( " = " ) ;
if ( b. up == 0 ) printf ( "Inf" ) ;
else
{
showResult ( reduction ( result4) ) ;
}
return 0 ;
}
学习代码
#include <iostream>
#include <cmath>
using namespace std;
long long a, b, c, d;
long long gcd ( long long t1, long long t2) {
return t2 == 0 ? t1 : gcd ( t2, t1 % t2) ;
}
void func ( long long m, long long n) {
if ( m * n == 0 ) {
printf ( "%s" , n == 0 ? "Inf" : "0" ) ;
return ;
}
bool flag = ( ( m < 0 && n > 0 ) || ( m > 0 && n < 0 ) ) ;
m = abs ( m) ; n = abs ( n) ;
long long x = m / n;
printf ( "%s" , flag ? "(-" : "" ) ;
if ( x != 0 ) printf ( "%lld" , x) ;
if ( m % n == 0 ) {
if ( flag) printf ( ")" ) ;
return ;
}
if ( x != 0 ) printf ( " " ) ;
m = m - x * n;
long long t = gcd ( m, n) ;
m = m / t; n = n / t;
printf ( "%lld/%lld%s" , m, n, flag ? ")" : "" ) ;
}
int main ( ) {
scanf ( "%lld/%lld %lld/%lld" , & a, & b, & c, & d) ;
func ( a, b) ; printf ( " + " ) ; func ( c, d) ; printf ( " = " ) ; func ( a * d + b * c, b * d) ; printf ( "\n" ) ;
func ( a, b) ; printf ( " - " ) ; func ( c, d) ; printf ( " = " ) ; func ( a * d - b * c, b * d) ; printf ( "\n" ) ;
func ( a, b) ; printf ( " * " ) ; func ( c, d) ; printf ( " = " ) ; func ( a * c, b * d) ; printf ( "\n" ) ;
func ( a, b) ; printf ( " / " ) ; func ( c, d) ; printf ( " = " ) ; func ( a * d, b * c) ;
return 0 ;
}