2023-10-29-LearningRecord
刷题Day001
题目一
[NOIP2002 普及组] 级数求和
题目描述
已知:。显然对于任意一个整数 ,当 足够大的时候,。
现给出一个整数 ,要求计算出一个最小的 ,使得 。
输入格式
一个正整数 。
输出格式
一个正整数 。
样例 #1
样例输入 #1
样例输出 #1
提示
【数据范围】
对于 的数据,。
【题目来源】
NOIP 2002 普及组第一题
暴力解法:
1 2 3 4 5 6 7 8 9 10 11
| int main() { int k; scanf("%d", &k); double SUM = 0; int n = 0; while (SUM < k) { SUM += 1.0 / ++n; } cout << n; return 0; }
|
更优的解-数论(调和级数):
▶调和级数讲解
已知
欧拉推导过求调和级数有限多项和的表达式为 ()
因为题目要求满足的条件是 化简得
因此只需求 并向上取整即可
1 2 3 4 5 6 7 8 9 10 11 12
| #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<math.h> using namespace std;
int main() { int k; scanf("%d", &k); int n = exp((double)k - 0.5772156649) + 0.5; cout << n; return 0; }
|
ps:我不知道为什么 - 1改成 +0.5然后去小数刚好是正确答案 希望有人能解答一下QAQ
