# include <iostream>
# include <vector>
# include <cmath>
# include <climits>
using namespace std;
typedef long long ll;
inline ll gcd(ll a, ll b){ // 最大公约数 化简用
return b==0 ? a : gcd(b, a%b);
}
struct Fraction
{
ll up;
ll dn;
Fraction() = default;
// 制造一个化简的Fraction对象
Fraction(ll u, ll d){
up = u;
dn = d;
ll t = gcd(abs(up), dn);
up /= t;
dn /= t;
}
// 化简
void HuaJian(){
ll t = gcd(abs(up), dn);
up /= t;
dn /= t;
}
// 输出
void show()
{
if(up == 0){
cout << "0" << endl;
return;
}
if(up % dn == 0){ // 整除
printf("%lld\n", up/dn);
}
else
if(up > dn){ // 输出假分数
printf("%lld %lld/%lld\n", up / dn, up - up/dn*dn, dn);
}
else
if(up < dn){ // 输出真分数
printf("%lld/%lld\n", up, dn);
}
}
};
vector<Fraction> F; // 存储输入数据的,其实可以边输入边求和的……
int N;
// 求分数和
Fraction Fraction_Sum()
{
Fraction sum = F[0];
for(int i = 1;i<N;++i){
sum.up = sum.up * F[i].dn + sum.dn*F[i].up;
sum.dn = sum.dn * F[i].dn;
sum.HuaJian();
}
return sum;
}
int main()
{
// 输入
scanf("%d", &N);
for(int i=0;i<N;++i){
ll up;
ll down;
scanf("%lld/%lld", &up, &down);
F.push_back(Fraction(up, down));
}
// 求和
Fraction fsum = Fraction_Sum();
// 输出
fsum.show();
return 0;
}
【PAT甲级、分数的运算、C++】1081 Rational Sum (20分)
最新推荐文章于 2021-03-22 23:09:36 发布