题解
很水的一个高斯消元
当模板题练一下手就好了
CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int N=10;
double eps=1e-3;
double f[N];
int d;
double s[N][N];
int m,n;
double Get (int x,int y)
{
int lalal=1;
for (int u=1;u<=y;u++)
lalal=lalal*x;
return (double)lalal;
}
double ans[N];
void Guess ()
{
for (int u=2;u<=m;u++)
{
for (int i=u;i<=m;i++)
{
double g=s[i][u-1]/s[u-1][u-1];
for (int j=u;j<=m+1;j++)
s[i][j]=g*s[u-1][j]-s[i][j];
}
}
for (int u=m;u>=1;u--)
{
ans[u]=s[u][m+1];
for (int i=u+1;i<=m;i++)
ans[u]=ans[u]-ans[i]*s[u][i];
ans[u]=ans[u]/s[u][u];
}
}
bool check (int x)//这个错了行不行
{
m=0;
for (int u=0;u<=n+2;u++)
{
if (u==x) continue;//跳过这一个
m++;
for (int i=1;i<=n;i++) s[m][i]=Get(u,i);//各个系数
s[m][n+1]=1;
s[m][n+2]=f[u];
if (m==n+1) break;
}
for (int u=1;u<=m+1;u++)
swap(s[1][u],s[m][u]);
/* for (int u=1;u<=m;u++)
{
for (int i=1;i<=m+1;i++)
printf("%lf ",s[u][i]);
printf("\n");
}*/
Guess();
for (int u=n+2;u>=0;u--)
{
if (u==x) continue;
bool tf=false;
double ooo=0;
for (int i=1;i<=n;i++)
ooo=ooo+ans[i]*Get(u,i);
ooo=ooo+ans[n+1];
if (abs(ooo-f[u])<=eps) return true;
return false;
}
}
int main()
{
while (true)
{
scanf("%d",&n);
if (n==0) break;
for (int u=0;u<=n+2;u++) scanf("%lf",&f[u]);
//check(2);
for (int u=0;u<=n+2;u++)//哪一个是错的
{
if (check(u)==true)
{
printf("%d\n",u);
break;
}
}
// printf("over\n");
}
return 0;
}