[NOIP2002 普及组] 级数求和

题目描述

已知:$S_n= 1+\dfrac{1}{2}+\dfrac{1}{3}+…+\dfrac{1}{n}$。显然对于任意一个整数 $k$,当 $n$ 足够大的时候, $S_n>k$。

现给出一个整数 $k$,要求计算出一个最小的 $n$,使得 $S_n>k$。

输入格式

一个正整数 $k$。

输出格式

一个正整数 $n$。

样例 #1

样例输入 #1

1
1

样例输出 #1

1
2

提示

【数据范围】

对于 $100\%$ 的数据,$1\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

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

  1. find_min_n 函数定义:

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

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

    • 一旦 $S_n$ 大于给定的整数 $k$,循环结束,函数返回此时的整数 $n$。
  4. 输入和输出:

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

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