建民打卡日记5.5
一、问题描述
本题的要求很简单,就是求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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?