本文由Jzwalliser原創,發布在CSDN平臺上,遵循CC 4.0 BY-SA協議。
因此,若需轉載/引用本文,請注明作者并附原文鏈接,且禁止刪除/修改本段文字。
違者必究,謝謝配合。
個人主頁:blog.csdn.net/jzwalliser
題目
洛谷 P1035 [NOIP2002 普及組] 級數求和
[NOIP2002 普及組] 級數求和
題目描述
已知: S n = 1 + 1 2 + 1 3 + … + 1 n S_n= 1+\dfrac{1}{2}+\dfrac{1}{3}+…+\dfrac{1}{n} Sn?=1+21?+31?+…+n1?。顯然對于任意一個整數 k k k,當 n n n 足夠大的時候, S n > k S_n>k Sn?>k。
現給出一個整數 k k k,要求計算出一個最小的 n n n,使得 S n > k S_n>k Sn?>k。
輸入格式
一個正整數 k k k。
輸出格式
一個正整數 n n n。
樣例 #1
樣例輸入 #1
1
樣例輸出 #1
2
提示
【數據范圍】
對于 100 % 100\% 100% 的數據, 1 ≤ k ≤ 15 1\le k \le 15 1≤k≤15。
【題目來源】
NOIP 2002 普及組第一題
想法
題目其實挺簡單的,按照題目的意思,把公式套進去,然后循環,直到結果大于 k k k就可以了。但是需要注意精度問題。當時用C++做這道題的時候,做了許多便都沒有過,期間嘗試了很多精度優化方式都失敗了,直到后來才注意到我用的是數據類型float
,精度不夠;改成double
后就通過了。
實現
- 輸入。
- 循環,向累加器中增加 1 i \frac{1}{i} i1?。
- 判斷是否大于 k k k,如果滿足條件則跳出循環。
- 輸出。
題解
C++
#include<bits/stdc++.h>
using namespace std;
int main(){int k;int n = 0;cin >> k; //輸入double s = 0; //累加器,注意double類型while(s <= k){n += 1; //當前數加一s += double(1) / n; //注意強制類型轉換一下}cout << n; //輸出
}
Python
k = int(input()) #輸入
n = 0
s = 0 #累加器
while s <= k:n += 1 #當前數加一s += 1 / n
print(n) #輸出
難度
難度:★☆☆☆☆
這道題難度不高,但是注意數據類型為double
。不知當年比賽時選擇了float
作為數據類型的選手們比賽結束拿到結果有多奔潰……
結尾
這道題你是怎樣寫的?歡迎討論!