题目描述
计算积分
保留至小数点后5位。若积分发散,请输出"orz"。
输入格式
一行,包含一个实数,为a的值
输出格式
一行,积分值或orz
输入输出样例
输入 #1
2.33
输出 #1
1.51068
说明/提示
a<=50
请注意时空限制。
解释:高等数学题呗,0点可以用1e-7来近似
#include <bits/stdc++.h>
double a;
inline double f(double x) {
return pow(x,a/x-x); //原函数
}
inline double simpson(double l,double r) { //Simpson公式
double mid=(l+r)/2;
return (f(l)+4*f(mid)+f(r))*(r-l)/6;
}
double asr(double l,double r,double eps,double ans) {
double mid=(l+r)/2;
double l_=simpson(l,mid),r_=simpson(mid,r);
if(fabs(l_+r_-ans)<=15*eps) return l_+r_+(l_+r_-ans)/15; //确认精度
return asr(l,mid,eps/2,l_)+asr(mid,r,eps/2,r_); //精度不够则递归调用
}
inline double asr(double l,double r,double eps) {
return asr(l,r,eps,simpson(l,r));
}
int main() {
scanf("%lf",&a);
if(a<0) printf("orz\n");
else printf("%.5lf\n",asr(1e-7,20,1e-7));
return 0;
}