Vijos級數求和
阿新 • • 發佈:2018-12-25
描述
已知:Sn= 1+1/2+1/3+…+1/n。顯然對於任意一個整數K,當n足夠大的時候,Sn大於K。
現給出一個整數K(1<=k<=15),要求計算出一個最小的n;使得Sn>K。
格式
輸入格式
輸入 k
輸出格式
輸出 n
樣例1
樣例輸入1
1
樣例輸出1
2
首先要說明的是,這是一個調和數列,這個陣列是發散的,所以沒有相應的求和公式,只有一個近似求解的辦法,那就是
1+1/2+1/3+…+1/n ≈ lnn+C (其中C ≈ 0.57722,是一個無理數,稱作尤拉初始,專為調和級數所用)。
但是顯然,在這道題中n並滿足很大的情況,不能用這個式子近似估計,這樣誤差會很大!
正常求解是非常簡單的,但一定要注意宣告的資料型別!!一開始我就是因為用的float導致一直有兩個case是wa……
#include<stdio.h> int get_min(double number); int main() { double number; int result; scanf("%lf",&number); result=get_min(number); printf("%d\n",result); return 0; } int get_min(double number) { double sum=0; double i=1; while(sum<=number) { sum+=1/i; i++; } return (int)(i-1); }
(當然,double型別是不能說相等的,最好用絕對值的差來說明)
總結:double型別的精度要高於float,以後要特別注意資料型別的選擇!