#include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<stack> #include<string> #include<cmath> #include<algorithm> using namespace std; #define maxn 100 double Langrange(double x[],double y[],int n,double xx) { double ans=0; for(int i=0;i<=n;i++){ double tmp=1; for(int j=0;j<=n;j++){ if(i==j)continue; tmp*=(xx-x[j])/(x[i]-x[j]); } ans+=tmp*y[i]; } return ans; } double Newton(double x[],double y[],int n,double xx) { double ma[maxn][maxn]; memset(ma,0,sizeof(ma)); for(int i=0;i<=n;i++)ma[i][0]=y[i]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ma[i][j]=(ma[i][j-1]-ma[i-1][j-1])/(x[i]-x[i-j]); double ans=0,tmp=1; for(int i=0;i<=n;i++){ ans+=tmp*ma[i][i]; tmp*=(xx-x[i]); } return ans; } double x[maxn],y[maxn]; int main() { int n; while(true){ scanf("%d",&n); if(n==0)break; for(int i=0;i<=n;i++)scanf("%lf",&x[i]); for(int i=0;i<=n;i++)scanf("%lf",&y[i]); double xx; scanf("%lf",&xx); double ans1=Langrange(x,y,n,xx); double ans2=Newton(x,y,n,xx); printf("%lf %lf\n",ans1,ans2); } return 0; }
今天在马原课上写的。。。。。
代码里面的n代表的是x0,x1,x2,x3……xn的n
刚开始以为牛顿插值前提必须是x0,x1,x2……xn,按照一定的顺序排列,错了~
实测数据不多。估计会有错误。