题目链接
注意点:
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;
}