1. 程式人生 > >Vijos級數求和

Vijos級數求和

描述
已知: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,以後要特別注意資料型別的選擇!