C++洛谷题解(36)——P1035

这一期是第100期!

题目信息

题名:级数求和

题目:已知:Sⁿ= 1+½+⅓+…+⅟ⁿ​。显然对于任意一个整数 k,当 n 足够大的时候,Sⁿ​>k。

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

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

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

输入样例:1

输出样例:2

说明提示:对于 100% 的数据,1≤k≤15。NOIP 2002 普及组第一题

分析题目

这道题的题号其实是我的电脑的CPU的具体型号:

言归正传,这道题对数学的要求非常高,由于本人数学一般,就不在数学方面多说了,直接摘抄一段(凑合着看吧,实在复制不下来):

已知Sn=1+1/2+1/3+...+1/n=1⅟ⁿ​。明显地,Sn为第n个调和数。欧拉推导过求调和级数有限多项和的表达式为ln(n+1)+γ,我们拿过来用即可。(γ约等于0.5772156649)我们需要满足Sn>k,即满足ln(n+1)+γ>k,化简得n>ek−γ−1。我们只需求满足上式的最小的n,所以nek−γ+0.5(四舍五入),即模拟做法的时间复杂度为O(ek−γ)。

说了一堆,缩减后就是用g表示γ,数据为0.5772156649。然后n = exp(k - g) + 0.5。最后直接输出n的值就行了。直接上思路:

  1. 声明g,表示γ
  2. 声明k和n
  3. 输入k的值
  4. 用n = exp(k - g) + 0.5求出n的值
  5. 输出n的值

直接上代码

示例代码

注释版:

#include <bits/stdc++.h> //万能头
using namespace std;
const double g = 0.5772156649; //定义一下γ的值
int main()
{
    int k, n;             //声明k和n
    cin >> k;             //输入k
    n = exp(k - g) + 0.5; //计算n的值
    cout << n << endl;    //输出n
    system("pause");
    return 0; //结束
}

复制版:

#include <bits/stdc++.h>
using namespace std;
const double g = 0.5772156649;
int main()
{
    int k, n;
    cin >> k;
    n = exp(k - g) + 0.5;
    cout << n << endl;
    system("pause");
    return 0;
} 
posted @ 2022-07-19 19:46  GitTJBKBeta  阅读(11)  评论(0编辑  收藏  举报