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);
}