洛谷P1035 级数求和 题解 简单模拟

题目链接:https://www.luogu.com.cn/problem/P1035

题目描述

已知:\(S_n= 1+1/2+1/3+…+1/n\)。显然对于任意一个整数 \(k\),当 \(n\) 足够大的时候,\(S_n>k\)
现给出一个整数 \(k\),要求计算出一个最小的 \(n\),使得 \(S_n>k\)

输入格式

一个正整数 \(k\)

输出格式

一个正整数 \(n\)

样例输入1

1

样例输出1

2

说明/提示

【数据范围】
对于 \(100\%\) 的数据,\(1\le k \le 15\)

题解

我道题目其实是找最小的满足 \(\sum_{i=1}^n S_i > k\)\(n\)

我们可以开一个循环来模拟这个问题。

我们只需要一开始开两个变量:

  • 变量 \(S\) 表示当前和 \(S_n\)(初始时 \(S=0\));
  • 变量 \(n\) 表示当前的坐标 \(n\)(初始时 \(n=1\))。

然后 \(n\)\(1\) 开始遍历(即 \(n = 1、2、3、 \cdots\) 这样遍历)。
每一次循环内我们让 \(S\) 加上 \(\lfloor \frac{1}{n} \rfloor\)
直到第一次满足 \(S > k\) 时,我们输出此时的 \(n\) 并结束我们的程序即可。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
double k, S; // 因为我们在计算S和k的时候S有可能是小数,所以这里都用double来保存
int n = 1; // n我还是用int,但是我在处理的时候会将其转换成double,
// 这样操作看上去有些多此一举,但是也是出于我的习惯囧。其实n也可以定义成double类型
int main() {
    cin >> k;
    while (true) {
        S += 1.0 / (double) n;  // 注意,表示常实数1最好加一个“,0”
        if (S > k) {
            cout << n << endl;
            break;
        }
        n ++;   // n要自增一,以进行下一步处理
    }
    return 0;
}
posted @ 2019-12-06 10:04  quanjun  阅读(236)  评论(0编辑  收藏  举报