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的值就行了。直接上思路:
- 声明g,表示γ
- 声明k和n
- 输入k的值
- 用n = exp(k - g) + 0.5求出n的值
- 输出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;
}