编写计算调和级数和的程序。计算结果用有理数表示,即分数形式。 要求:用户输入级数n,程序输出分数形式
时间: 2024-11-13 12:18:04 浏览: 9
编写一个计算调和级数和的程序,你可以使用动态规划的方法。调和级数是从1到n的所有正整数倒数之和,其公式为:
\[ H_n = \sum_{i=1}^{n}\frac{1}{i} \]
在C++中,我们可以使用分数(Fraction)数据结构来表示结果,但标准库中并没有直接提供这样的类型,所以我们可以手动实现一个简单的分数类。以下是一个基本的实现示例:
```cpp
#include <iostream>
#include <vector>
class Fraction {
public:
int numerator;
int denominator;
// 构造函数,初始化为0/1
Fraction() : numerator(0), denominator(1) {}
// 按照两个整数的比例更新分数
void update(int num, int den) {
long long gcd = __gcd(numerator * den, denominator * num);
numerator *= den / gcd;
denominator *= num / gcd;
}
// 输出分数,确保分母大于零
std::string to_string() const {
if (denominator == 1)
return std::to_string(numerator);
else if (numerator % denominator == 0)
return std::to_string(numerator / denominator);
else
return std::to_string(numerator) + "/" + std::to_string(denominator);
}
private:
// 使用GCD(最大公约数)进行简化
static int __gcd(int a, int b) {
return b == 0 ? a : __gcd(b, a % b);
}
};
// 计算调和级数和
Fraction harmonic_sum(int n) {
Fraction sum(1, 1); // 初始化总和为1/1
for (int i = 2; i <= n; ++i) {
sum.update(sum.numerator + i, sum.denominator);
}
return sum;
}
int main() {
int n;
std::cout << "请输入级数项数n: ";
std::cin >> n;
if (n <= 0) {
std::cerr << "错误:n必须是正整数。\n";
return 1;
}
Fraction result = harmonic_sum(n);
std::cout << "调和级数和(n = " << n << ")为: " << result.to_string() << "\n";
return 0;
}
```
这个程序首先定义了一个`Fraction`类,用于存储分数并提供简化操作。然后在`harmonic_sum`函数中,我们逐个添加从1到n的分数。最后,在`main`函数中获取用户输入的n,并打印结果。
阅读全文