题解
2026-02-01 18:00:11
发布于:湖南
6阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 计算最大公约数
long long gcd(long long a, long long b) {
while (b != 0) {
long long temp = b;
b = a % b;
a = temp;
}
return a;
}
// 计算最小公倍数
long long lcm(long long a, long long b) {
return a / gcd(a, b) * b;
}
int main() {
int n;
cin >> n;
// 计算调和级数 H(n) = 1 + 1/2 + ... + 1/n
long long numerator = 0;
long long denominator = 1;
for (int i = 1; i <= n; ++i) {
// 通分并累加 1/i
long long new_denominator = lcm(denominator, i);
numerator = numerator * (new_denominator / denominator) + (new_denominator / i);
denominator = new_denominator;
// 约分
long long g = gcd(numerator, denominator);
numerator /= g;
denominator /= g;
}
// 乘以 n 得到最终分数 E(n) = n * H(n)
numerator *= n;
long long g = gcd(numerator, denominator);
numerator /= g;
denominator /= g;
// 拆分整数部分和分数部分
long long integer_part = numerator / denominator;
long long frac_num = numerator % denominator;
// 输出处理
if (frac_num == 0) {
// 整数情况
cout << integer_part << endl;
} else {
// 分数情况
// 计算各部分的宽度,用于对齐
string int_str = to_string(integer_part);
string num_str = to_string(frac_num);
string den_str = to_string(denominator);
int line_len = den_str.length();
// 第一行:分子,对齐到分数线
cout << string(int_str.length(), ' ') << " " << num_str << endl;
// 第二行:整数部分 + 分数线
cout << int_str << " " << string(line_len, '-') << endl;
// 第三行:分母,对齐到分数线
cout << string(int_str.length(), ' ') << " " << den_str << endl;
}
return 0;
}
这里空空如也







有帮助,赞一个