#include <iostream>
#include <algorithm>
using namespace std;
struct Node {
int x;
int y;
}node[1010];
int gcd(int a, int b) {
if (b == 0)return a;
return gcd(b, a % b);
}
int main() {
int n,sum_x=0,sum_y=1;
cin >> n;
for (int i = 0; i < n; i++) {
scanf_s("%d/%d", &node[i].x, &node[i].y);
sum_y *= node[i].y;//公共分母,分母同分
}
for (int i = 0; i < n; i++) {
int x=node[i].x;
for (int j = 0; j < n; j++) {
if (i != j)
x *= node[j].y;//分子也通分
}
sum_x += x;
}
if (sum_x == 0)//分子为0
cout << 0 << endl;
else if (sum_x % sum_y == 0)//分子能整除分母
//4/3 2/3
//sum_x=6 sum_x=3
//sum_x/sum_y=2
cout << sum_x / sum_y << endl;
else {//分子不能整除分母//1.>=1 2.<1
if (sum_x / sum_y >= 1) {
//4/3+1/3=5/3=1 2/3
//sum_x=5 sum_y=3
//A=sum_x/sum_y=1
//sum_x=sum_x%sum_y=5%3=2
//tmp=gcd(2,3)=1
//1 sum_x/tmp=2 "/" sum_y/tmp=3
int A = sum_x / sum_y;//整除直接要这个了
sum_x%=sum_y;//6/13/A已经拿走了A*1/sum_y,所以sum_x要变小,是拿走后的分子
int tmp = gcd(sum_x, sum_y);//求最大公约数//*通分不像样,要化简
cout << A << " " << sum_x / tmp << "/" << sum_y/tmp << endl;
}
else {
//1/3+(-1/6)+1/8=--8/24+(-4/24)+3/24=/24
//sum_y=3*6*8=144
//sum_x=1*6*8+(-1)*3*8+1*3*6=48-24+18=24+18=42
//sum_x%sum_y=42%144=0...42<1
//tmp=gcd(42,144)=6
//sum_x/6=7 sum_y/6=24
//7/24
int tmp = gcd(sum_x, sum_y);//*通分不像样,要化简
cout << sum_x / tmp << "/" << sum_y / tmp << endl;
}
}
return 0;
}
|分数计算|L1-009 N个数求和 (20 分)
最新推荐文章于 2022-03-17 15:37:55 发布