L1-009 N个数求和
作者:
lvjj
,
2024-04-05 23:33:36
,
所有人可见
,
阅读 6
#include <bits/stdc++.h>
using namespace std;
//测试点三不过是因为int太小,要用long long int。输入用%ld
// 计算最小公倍数
long long int lcm(int a, int b) {
return (a / __gcd(a, b)) * b;
}
const long long int N = 110;
long long int sum_a,sum_b;
int main() {
long long int n;
scanf("%lld",&n);
if(n==1){//只有一个分数相加的情况
long long int a1,b1;
scanf("%lld/%lld",&a1,&b1);
sum_a = a1;
sum_b = b1;
}
else{
//下面的代码只适用于两个以及两个以上的分数相加,所以可以加个if判断一下只有一个分数的情况
long long int a[N],b[N];
for(long long int i=0;i<n;i++){
scanf("%lld/%lld",&a[i],&b[i]);
}
sum_a = (lcm(b[0],b[1])/b[0]*a[0])+(lcm(b[0],b[1])/b[1]*a[1]);
sum_b = lcm(b[0],b[1]);
for(long long int i=2;i<n;i++){
long long int temp = sum_b;//用temp处理了小bug:因为sum_b = lcm...这一行更新了sum_b的值,然而我的sum_a中的公式里面的sum_b是没更新前的值,所以需要临时变量存储没更新前的sum_b放到sum_a中的公式
sum_b = lcm(sum_b,b[i]);
sum_a = (lcm(temp,b[i])/temp*sum_a)+(lcm(temp,b[i])/b[i]*a[i]);
}
}//这个括号是特判有多个分数相加的情况
long long int t = __gcd(sum_b,sum_a);
sum_b/=t;
sum_a/=t;
//又有个bug:当求两个数的最大公约数时候,分子数是负数,那么最大公因数也是负的,这有个问题:-50/1000中,最大公约数是-50,导致除t后sum_a=1,sum_b=-200
//所以输出格式有问题:1/-20,最后要变为-1/20
if(sum_b<0&&sum_a>0){
sum_b*=-1;
sum_a*=-1;
}
// cout<<sum_a<<'/'<<sum_b;
if(sum_a%sum_b==0){
cout<<sum_a/sum_b;
} else{
if(sum_a/sum_b!=0)cout<<sum_a/sum_b<<' ';//整数部分不为0就输出整数部分
sum_a = sum_a - (sum_a/sum_b)*sum_b;
cout<<sum_a<<'/'<<sum_b;
}
return 0;
}