[NOIP2002 普及组] 级数求和

题目描述

已知:Sn=1+12+13++1nS_n= 1+\dfrac{1}{2}+\dfrac{1}{3}+…+\dfrac{1}{n}。显然对于任意一个整数 kk,当 nn 足够大的时候, Sn>kS_n>k

现给出一个整数 kk,要求计算出一个最小的 nn,使得 Sn>kS_n>k

输入格式

一个正整数 kk

输出格式

一个正整数 nn

样例 #1

样例输入 #1

1
1

样例输出 #1

1
2

提示

【数据范围】

对于 100%100\% 的数据,1k151\le k \le 15

【题目来源】

NOIP 2002 普及组第一题

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
def find_min_n(k):
Sn = 0
n = 0
while Sn <= k:
n += 1
Sn += 1 / n
return n


k = int(input())
result = find_min_n(k)
print(result)

题解解释

来自ChatGPT

这段代码是用来寻找一个最小的整数 nn,使得累加和 SnS_n 大于给定的整数 kk。下面是对代码的解释:

  1. find_min_n 函数定义:

    • find_min_n 是一个函数,它接受一个整数参数 k
    • Sn 初始化为 0,表示累加和。
    • n 初始化为 0,表示整数 nn
    • 使用 while 循环,不断迭代,直到 SnS_n 大于给定的整数 kk
    • 在每次循环中,n 自增 1,表示考虑下一个分数项 1n\frac{1}{n}
    • Sn 更新为之前的累加和加上新的分数项 1n\frac{1}{n}
  2. 循环条件:

    • 循环条件是 Sn <= k,即当累加和小于或等于给定的整数 kk 时继续循环。
  3. 返回结果:

    • 一旦 SnS_n 大于给定的整数 kk,循环结束,函数返回此时的整数 nn
  4. 输入和输出:

    • 使用 input() 获取一个整数输入作为 kk
    • 将输入的 kk 传递给 find_min_n 函数,得到结果 result
    • 打印输出 result,即最小的整数 nn

整体来说,这段代码通过迭代的方式计算累加和 SnS_n 直到满足条件 Sn>kS_n > k,然后返回最小的整数 nn。这种方法相比递归更高效,因为避免了递归深度过大的问题。