#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
struct Franction
{
int up,down;
};//将分数用结构体打包;
int gcd(int a,int b)
{
if(b==0)
{
return a;
}
else
{
return gcd(b,a%b);
}
}//用辗转相除法求最大公因数,这种写法不用考虑a与b的大小关系,因为即使a比b小,在第一层递归中也会将a与b互换
Franction reduction(Franction result)
{
if(result.down<0)
{
result.up=-result.up;
result.down=-result.down;
}//将负号放在分子上
if(result.up==0)
{
result.down=1;
}//当分子为0时,令分母为1
else
{
int d=gcd(abs(result.up),abs(result.down));
result.up /= d;
result.down /= d;
}//对分子分母进行约分
return result;
}
Franction add(Franction f1,Franction f2)
{
Franction result;
result.up=f1.up*f2.down+f2.up*f1.down;
result.down=f1.down*f2.down;
return reduction(result);
}//先通分,再相加,最后化简
//分数的减乘除与加法类似
void showResult(Franction r)
{
r=reduction(r);
if(r.down==1)
{
printf("%lld",r.up);
}//当化简后分母为1,说明为整数,直接输出
if(abs(r.up)>abs(r.down))
{
printf("%d %d/%d",r.up/r.down,abs(r.up)%abs(r.down),abs(r.down));
}//当化简后分子大于分母,说明为假分数,化为带分数输出
else
{
printf("%d/%d",r.up,r.down);
}//若为真分数,则直接输出
}//分数的输出