建民打卡日记5.5

发布时间 2023-05-05 19:06:42作者: cor0000

一、问题描述

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

二、流程设计

实际上本题考察分数相加:即分母通分,分子相加,约分。
 
最大公约数 gcd(),使用递归的方式实现辗转相除法求最大公约数。
 
return b ? gcd(b, a % b) : a;
 
输出的时候注意考虑所有情况:
设结果为n,则① n > 1;② n = 1;③ n < 1;

三、代码实现

#include <bits/stdc++.h>
using namespace std;

int gcd(int a, int b) {
	if (b == 0)
		return a;
	else
		return gcd(b, a % b);
}

int min_gb(int n, int m) {
	return n * m / gcd(n, m);
}

int main() {
	int n;
	cin >> n;
	int sum1 = 0;
	int sum2 = 0;
	for (int i = 0; i < n; i++) {
		if (i != 0) {
			int a, b;
			scanf("%d/%d", &a, &b);
			int k = min_gb(sum2, b);
			int j = gcd(sum2, b);
			sum1 = sum1 * (k / sum2) + a * (k / b);
			sum2 = k;
		} else {
			int a, b;
			scanf("%d/%d", &a, &b);
			sum1 += a;
			sum2 += b;
		}
	}
	int b = gcd(sum1, sum2);
	if (sum1 == 0)
		cout << "0";
	else {
		if (b != 1 && sum1 > 0) {
			sum1 /= b;
			sum2 /= b;
		} else {
			sum1 = sum1 / b * -1;
			sum2 = sum2 / b * -1;
		}
		if (sum1 < sum2) {
			cout << sum1 << "/" << sum2 << endl;
		} else if (sum1 % sum2 == 0) {
			cout << sum1 / sum2 << endl;
		} else
			cout << sum1 / sum2 << " " << sum1 % sum2 << "/" << sum2 << endl;
	}
}