题意:给出一个n次多项式在0,1,2…n+2处的函数值,已知其中恰有一个是错误的函数值,求那个错误的函数值对应的x取值。
解法:
1.枚举n+1个函数值,得到插值多项式。
2.将剩下两个值代入多项式恰满足其中一个值,则那个不满足的值就是答案。为了保证答案的准确性,我们对正确的n+2个函数值做n+1次差值,若剩下一个函数值始终不符合,则剩下那个一定是错误的函数值。
注:此题还可以用高斯消元做。
1枚举n+1个函数值,得到线性方程组
2.用高斯消元求出各项系数,代入剩余两个函数值,同上判断。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define y1 y11
#define mem(a,b) memset(a,sizeof(a),b)
using namespace std;
typedef long long ll;
const int maxn = 10000+10;
const double eps=1e-5;
int n;
double v[maxn];
double abs(double x){
if(x>0) return x;
return -x;
}
bool judge(int x,int y){
double tmpx=0.0,tmpy=0.0;
for(int i=0;i<n+3;i++){
double tmpzix=1.0,tmpmux=1.0,tmpziy=1.0,tmpmuy=1.0;
if(i==x||i==y) continue;
for(int j=0;j<n+3;j++){
if(j==i||j==x||j==y) continue;
tmpzix*=(x-j);
tmpmux*=(i-j);
tmpziy*=(y-j);
tmpmuy*=(i-j);
}
tmpx+=(tmpzix/tmpmux*v[i]),tmpy+=(tmpziy/tmpmuy*v[i]);
}
return abs(tmpx-v[x])>0.5&&abs(tmpy-v[y])<0.5;
}
bool judge1(int x){
for(int i=0;i<n+3;i++){
if(i!=x&&judge(x,i)==false) return false;
}
return true;
}
int main(){
//freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
if(n==0) break;
for(int i=0;i<n+3;i++) scanf("%lf",&v[i]);
int biao=-1;
for(int i=0;i<n+3&&biao==-1;i++){
if(judge1(i)) biao=i;
}
printf("%d\n",biao);
}
return 0;
}