# P1572 计算分数
## 题目描述
Csh 被老妈关在家里做分数计算题,但显然他不愿意做这么多复杂的计算。况且在家门口还有 Xxq 在等着他去一起看电影。为了尽快地能去陪 Xxq 看电影,他把剩下的计算题交给了你,你能帮他解决问题吗?
## 输入格式
输入一行,为一个分数计算式。
计算式中只包含数字、`+`、`-`、`/`。其中 `/` 为分数线,分数线左边为分子,右边为分母。输入数据保证不会出现繁分数。如果输入计算式的第一项为正,不会有前缀 `+` 号;若为负,会有前缀 `-` 号。
所有整数均以分数形式出现。
## 输出格式
输出一行,为最后的计算结果(用为整数则用整数表示,否则用最简分数表示)。
保证答案内出现的所有数(如果答案是分数即为分子和分母)均在 $32$ 位带符号整数的表示范围之内。
## 输入输出样例 #1
### 输入 #1
```
2/1+1/3-1/4
```
### 输出 #1
```
25/12
```
## 说明/提示
### 数据范围及约定
对于所有测试点,输入计算式长度在 $100$ 以内,分子、分母在 $1000$ 以内。同时保证,直接从前往后直接计算分数的和或者差,然后立刻化简,这么做的中间结果不会超过 int 的范围。
注意输入的分数不一定是最简分数。
------------
2024/2/13 添加 2 组 hack 数据。
#include <stdio.h>
#include <math.h>
struct fs
{
long long fm;
long long fz;
};
long long gcd(long long a,long long b)
{
while(a%b)
{
long long c=a%b;
a=b;
b=c;
}
return b;
}
int main()
{
struct fs a,b;
char c;
scanf("%lld/%lld",&a.fz,&a.fm);
long long g=gcd(a.fm,abs(a.fz));
a.fm/=g;a.fz/=g;
//printf("%d %d\n",a.fm,a.fz);
scanf("%c",&c);
while(scanf("%lld/%lld",&b.fz,&b.fm)!=EOF)
{
if(c==EOF)break;
else if(c=='+'){
long long m=a.fm*b.fm;
long long z=a.fz*b.fm+b.fz*a.fm;
long long g=gcd(m,abs(z));
m/=g;z/=g;
a.fm=m;a.fz=z;
}
else if(c=='-')
{
long long m=a.fm*b.fm;
long long z=a.fz*b.fm-b.fz*a.fm;
long long g=gcd(m,abs(z));
m/=g;z/=g;
a.fm=m;a.fz=z;
}
scanf("%c",&c);
//printf("%d/%d\n",a.fz,a.fm);
}
if(a.fm<0&&a.fz>0)
{
a.fm*=-1;
a.fz*=-1;
}
if(a.fz==0)
printf("0");
else if(a.fm==1)printf("%lld",a.fz);
else printf("%lld/%lld",a.fz,a.fm);
return 0;
}