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
笔记
本题考查的是浮点数的比较,整理如下:
#include<math.h>
const double eps = 1e-8
#define Equ(a,b) (fabs((a)-(b))<(eps))
#define Less(a,b) ((a)-(b)<(-eps))
#define More(a,b) ((a)-(b)>(eps))
#define LessEqu(a,b) ((a)-(b)<(eps))
#define MoreEqu(a,b) ((a)-(b)>(-eps))
本题还要特别注意Threshold>1的情况。
代码
#include<stdio.h>
const double eps = 1e-11;
#define More(a,b) ((a)-(b)>(-eps))
#define Less(a,b) ((a)-(b)<(-eps))
double factoria(int n){
double nn = (double)n;
int i;
for(i=n-1;i>=1;i--)
nn *= (double)i;
return nn;
}
int main(){
double t;
scanf("%lf",&t);
if(Less(1.0,t))
printf("0.000000 0\n");
else{
int n=1;
double e = 1 ;
while(More(1.0/factoria(n),t)){
e += 1/factoria(n);
n++;
}
printf("%.6f %d\n",e,n);
}
return 0;
}