東華oj-基礎題第21題-計算e

21 計算e

作者: Turbo時間限制: 1S章節: 循環

問題描述 :

利用公式e=1+ 1/1! + 1/2! + 1/3! + … + 1/n!,編程計算e的近似值,直到最後一項的絕對值小於threshold(該項不包括在結果內),輸出e的值並統計累加的項數。

輸入說明 :

輸入一個實數threshold,表示累加的閾值,數列中最後一項的值大於等於該閾值。Threshold最小可爲1e-10。

輸出說明 :

輸出一個實數表示e的值,保留6位小數,並輸出一個整數,表示累加的項數。兩個數字之間用一個空格分隔,在行首和行尾沒有多餘的空格。

輸入範例 :
0.00001  
輸出範例 :
2.718279 9

初始代碼:

/*
	T21 計算e
*/ 

#include<stdio.h>

int fac(int n); 

int main() {
	int i = 1;// 分母計數 
	double e = 1;
	double threshold = 0;
	double item = 1 / 1;
	
	scanf("%lf", &threshold);
	
	if (item < threshold) {
		printf("0.000000 0\n"); 
		return 0;
	}
	
	while (item >= threshold) {
		e += item;
		item = 1.0 / (fac(++i));
	} 

	printf("%lf %d\n", e, i); 
	
	return 0;
}

// 計算階乘 
int fac(int n) {
	if (n == 0) 
		return 1;
	if (n == 1) 
		return 1;
	
	return n * fac(n - 1); 
}

最小的測試數據結果錯了:
在這裏插入圖片描述
我重新檢查了一遍邏輯,沒發現哪裏有錯。想到只有最小的測試數據錯了,會不會是精度不夠?
我把變量類型都改成double,果然通過了。

AC代碼:

/*
	T21 計算e
*/ 

#include<stdio.h>
#include<math.h>		

double fac(double n); 

int main() {
	double i = 1;// 分母計數 
	double e = 1;
	double threshold = 0.0000000001;
	double item = 1 / 1;
	
	scanf("%lf", &threshold);
	
	if (item < threshold) {
		printf("0.000000 0\n"); 
		return 0;
	}
	
	while (fabs(item) >= threshold) {
		e += item;
		item = 1.0000000000 / (fac(++i));
	} 

	printf("%lf %d\n", e, (int)i); 
	
	return 0;
}

// 計算階乘 
double fac(double n) {
	if (n == 0) 
		return 1;
	if (n == 1) 
		return 1;
	
	return n * fac(n - 1); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章