分数的加法,数据都用long long存储就没问题,每一步加法后记得约分,最后一个坑点,最后的分子为0时输出0。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
class Rational{
ll numerator=1, denominator=1;
public:
Rational(ll n, ll d){
numerator = n;
denominator = d;
}
ll gcd(ll a, ll b){
if(b == 0) return a;
return gcd(b, a%b);
}
void simplify(){
ll tem = gcd(numerator, denominator);
numerator /= tem;
denominator /= tem;
}
void add(ll n, ll d){
ll tn = numerator*d+denominator*n;
ll td = d*denominator;
numerator = tn;
denominator = td;
simplify();
}
void show(){
simplify();
ll residue = numerator%denominator;
ll div = numerator/denominator;
if(div == 0 && numerator != 0){ //当整数部分不为0且有分数部分时输出分数
printf("%lld/%lld\n", numerator, denominator);
}
else {
printf("%lld", div);
if(residue != 0){
printf(" %lld/%lld\n", residue, denominator);
}
}
}
};
int main(){
//freopen("in.txt", "r", stdin);
int n;
scanf("%d", &n);
ll td, tn;
scanf("%lld/%lld", &tn, &td);
Rational r(tn, td);
for(int i = 1; i<n; i++){
getchar();
scanf("%lld/%lld", &tn, &td);
r.add(tn, td);
}
r.simplify();
r.show();
return 0;
}