洛谷P1035 [NOIP2002 普及组] 级数求和

洛谷P1035 [NOIP2002 普及组] 级数求和
[NOIP2002 普及组] 级数求和
题目描述
已知:S n = 1 + 1 2 + 1 3 + … + 1 n S_n= 1+\dfrac{1}{2}+\dfrac{1}{3}+…+\dfrac{1}{n}S
n

=1+
2
1

+
3
1

+…+
n
1

。显然对于任意一个整数 k kk,当 n nn 足够大的时候,S n > k S_n>kS
n

>k。

现给出一个整数 k kk,要求计算出一个最小的 n nn,使得 S n > k S_n>kS
n

>k。

输入格式
一个正整数 k kk。

输出格式
一个正整数 n nn。

样例 #1
样例输入 #1
1
1
样例输出 #1
2
1
提示
【数据范围】

对于 100 % 100\%100% 的数据,1 ≤ k ≤ 15 1\le k \le 151≤k≤15。

【题目来源】

NOIP 2002 普及组第一题

题目解析
题目大意
题目给出一个经典的调和级数公式S = ( 1 + 1 2 + 1 3 + 1 4 + … ) S = (1 + \frac{1}{2} + \frac{1}{3} + \frac{1}{4} + \ldots)S=(1+
2
1

+
3
1

+
4
1

+…),且易知调和函数f ( x ) = ∫ 1 ∞ 1 x d x f(x)= \int_{1}^{\infty} \frac{1}{x}\ dxf(x)=∫
1



x
1

dx发散,故调和级数不收敛,即当n→∞,有[ S = ∑ n = 1 ∞ 1 n ] [S = \sum_{n=1}^{\infty} \frac{1}{n}][S=∑
n=1



n
1

]→∞。因此对于一个确数n,必能找到最小n使得S SS>k。

n→∞

题目分析
题目给定公式,要求求出一个最小数,将该数带入公式后所得值大于给定值。

比如给定一个数2,则有当n=4时有S = ( 1 + 1 2 + 1 3 + 1 4 ) S = (1 + \frac{1}{2} + \frac{1}{3} + \frac{1}{4})S=(1+
2
1

+
3
1

+
4
1

)>2。

第一想法就是使用递归函数来实现:如果S<k,则继续调用函数求和,直到找到n
或者使用do……while结构来找到n

代码题解
解法1:

#include <iostream>
using namespace std;

int findN(double k, double sum, int n)
{

if (sum >= k)
{
return n-1;
}

else
{
return findN(k, sum + 1.0 / n, n + 1);
}
}
int main()
{
double k;

cin >> k;

double sum = 0.0;
int n = 1;
int result = findN(k, sum, n);

cout << result ;

return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
解法2:

#include <iostream>
using namespace std;
int main()
{
double sum = 0;
int k = 0;
cin >> k;
double n = 0;

do
{
sum += 1/ (double)(++n);
}
while (sum <=k);

cout << n;
return 0;
}
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_47351846/article/details/136049985

posted @ 2024-02-29 12:50  笠大  阅读(285)  评论(0)    收藏  举报