|分数计算|L1-009 N个数求和 (20 分)

link
refer

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值