PAT A1081 Rational Sum (20point(s))

题目链接
注意点:
1.题目给出的分子分母范围在int内,两个分母相乘时可能超出int范围,要用long long 创建分子分母。
2.每加一个数就要约分一次,否则容易溢出。
3.计算最大公约数时,必须是分子分母绝对值的公约数,否则下面数据会出错。

2
1/3 -1/2

//output
-1/6

AC代码

#include<cstdio>
#include<algorithm>
using namespace std;
long long gcd(long long a,long long b){//最大公约数,用于化简
    return !b? a:gcd(b,a%b);
}
struct fraction{
    long long numerator,denominator;
}test[110];
fraction reduction(fraction a){//化简
   if(a.numerator==0) a.denominator=1;//如果为零,则分子为零,分母为1
   else{ //分子分母同除最大公约数
       long long d=gcd(abs(a.numerator),abs(a.denominator));
       a.numerator/=d;
       a.denominator/=d;
   }
   return a;
}
fraction add(fraction a,fraction b){//分式加法
    fraction result;
    result.numerator=a.numerator*b.denominator+b.numerator*a.denominator;
    result.denominator=a.denominator*b.denominator;
    return reduction(result);
}
void show(fraction a){//输出分数
    reduction(a);//先化简
    if(a.denominator==1) printf("%lld",a.numerator);//整数,直接输出分子
    else if(abs(a.numerator)>abs(a.denominator)) printf("%lld %lld/%lld",a.numerator/a.denominator,a.numerator%a.denominator,a.denominator);
    //假分数要按照带分数的格式输出
    else printf("%lld/%lld",a.numerator,a.denominator); //真分数,正常输出
}
int main(){
    int n;
    fraction sum;
    sum.numerator=0;
    sum.denominator=1;//初始化为零
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%lld/%lld",&test[i].numerator,&test[i].denominator);
        sum=add(sum,test[i]);
    }
    show(sum);
    return 0;
}
发布了81 篇原创文章 · 获赞 0 · 访问量 661

猜你喜欢

转载自blog.csdn.net/weixin_44546393/article/details/105474591