Hello大家好我是小亦,今天呢国庆节也是到了,小亦祝大家真诚的国庆快乐!!以后我每天的题解尽量保持在3~8吧,有空的时候我就多多写题解哈,好那么好,那么今天呢我们继续来讲一下来自NOIP2002年普及组的真题:明教级数求和,其实NOIP的普及组刚开始的题目非常好写,作者呢有幸之年也能去看一看呀(我的一辈子),好了废话不多说,上这道题目的思路qwq:
首先呢,这道题是让我求数学,肥肠的简单好吧下面的是我个人的主要思路请看~
主要思路:
-
初始化变量:定义一个变量
sum
来累加调和级数的值,初始值为 0。定义一个变量n
来表示当前考虑的项数,初始值为 1。 -
循环累加:使用一个循环,从 n=1n=1 开始,逐项累加调和级数的值到
sum
中。 -
检查条件:在每次循环中,检查当前的
sum
是否已经大于 kk。如果sum
大于 kk,则停止循环。 -
更新 nn:如果
sum
不大于 kk,则增加 nn 的值,并继续累加下一项。 -
输出结果:当循环停止时,
n
的值将比实际需要的值多 1,因为循环在sum
仍然小于或等于 kk 时结束。因此,我们需要输出n - 1
作为结果。
数学分析:
调和级数的增长速度非常慢,但它是无界的,意味着随着 nn 的增加,SnSn 会无限增大。对于较小的 kk 值,我们可以通过直接计算调和级数的和来找到满足条件的最小的 n。
注意事项:
- 由于题目中 kk 的范围是 1≤k≤151≤k≤15,我们不需要使用对数或其他近似方法,直接计算调和级数即可。
- 在实际编程实现时,需要注意浮点数的精度问题,但在这个特定的问题中,由于 kk 的值很小,直接使用整数除法和累加即可。
通过这种方法,我们可以有效地找到满足条件的最小的 n,好了说完了代码供上好吧,小亦再次再次再次提醒大家抄代码可耻~
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int k;
cin >> k;
double sum = 0.0;
int n = 1;
while (sum <= k) {
sum += 1.0 / n;
n++;
}
cout << n - 1 << endl; // 输出结果
return 0;
}
由于代码过于简单,就不给详细的了