C 语言这样写 TLE:
#include<stdio.h>
#include<math.h>
double xs[105];
double dxs[105];
int n;
double qpow(double x,int n){
double res=1.000;
while(n){
if(n&1)res*=x;
x*=x;
n>>=1;
}
return res;
}
double f(double x){
double res=0.000;
for(register int i=0;i<=n;i++)res=res+(double)(qpow(x,i)*(double)xs[i]);
return res;
}
double f_(double x){//f'(x)用f_(x)代替
double res=0.000;
for(register int i=0;i<=n-1;i++)res+=(double)(qpow(x,i)*(double)dxs[i]);
return res;
}
int main(){
n=3;//n是最高次数
for(register int i=n;i>=0;i--){
scanf("%lf",xs[i]);
if(i!=0)dxs[i-1]=xs[i]*(double)i;//求导,注意任意常数导数为0
}
double x0=100.00;/*x0是初始近似解,可以调整*/
while(abs(f(x0))>1e-6){
double tmp=x0;
x0-=(f(tmp)/f_(tmp));//求近似解,控制精度误差
}
double p=1.0;
double x1=x0-p;
while(1){
x1=x0-p;
if(abs(f(x1))<1e-6)break;
p+=0.01;
}
p=1.0;
double x2=x1-p;
while(1){
x2=x1-p;
if(abs(f(x2))<1e-6)break;
p+=0.01;
}
printf("%.2lf %.2lf %.2lf",x2,x1,x0);
}