将分子分母分离后通分求和再约分,因为涉及到乘法,所以中间数据会超 int 所以要用 long long 代替,最后输出只需要稍加判断(如果是负分数,代数和分子都需要加上负号)。
如果报浮点错误就需要关注结果为0或者过程出现分子为0的情况。
#include
#include
#include
using namespace std;
typedef long long ll;
ll gcd(ll y,ll x)
{
if(!y || !x) return 1;//易错点!!! gcd对0处理
if(y < x) swap(x,y);
return y%x?gcd(x,y%x):x;
}
void output(ll fz,ll fm)
{
if(fz == 0)
{
cout << 0;
return;
}
int flag = fz < 0?-1:1;//符负数判断
fz = abs(fz);
int pre = 0;//代数
if(fz >= fm)//是否有代数
{
pre = fz/fm; //求代数
fz %= fm; //更新fz
}
if(pre) cout << flag*pre;
if(fz)
{
if(pre) cout << " ";
cout << fz*flag << '/' << fm;
}
}
int main()
{
int t;
cin >> t;
ll rm = 1,rz = 0;
while(t --)
{
ll fz,fm;
scanf("%lld/%lld",&fz,&fm);
rz = rz*fm + fz*rm;
rm *= fm;
ll r = gcd(abs(rz),rm);
rz /= r;
rm /= r;
}
output(rz,rm);
return 0;
}