题名:级数求和
题目:已知: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//万能头 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; //结束 }
复制版:
#includeusing 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; }



