一、问题描述
本题的要求很简单,就是求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;
}
}
标签:return,5.5,int,sum2,sum1,else,打卡,建民,gcd From: https://www.cnblogs.com/cor0000/p/17372304.html