uvalive 6185

高斯消元,以前从来没写过,今天的模拟比赛里面,添琦给了我一个模板!

虽然是个裸的,但是因为从来没写过,一个小细节竟然搞了我几个小时;

终于最后在小珺同志的帮助下成功a掉了,太开心了!

存一下,作为模板!

代码:

 1 #include<cstdio>
 2 #define maxn 10
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define eps 0.00001
 7 using namespace std;
 8 double matrix[maxn][maxn+1];
 9 double ans[maxn];
10 double a[maxn];
11 
12 void exchange_col(int p1,int p2,int n)
13 {
14     double t;
15     int i;
16     for(int i=0; i<=n; i++)
17         t=matrix[p1][i],matrix[p1][i]=matrix[p2][i],matrix[p2][i]=t;
18 }
19 
20 bool gauss(int n)
21 {
22     int i,j,k;
23     int p;
24     double r;
25     for(i=0; i<n-1; i++)
26     {
27         p=i;
28         for(j=i+1; j<n; j++)
29             if(abs(matrix[j][i])>abs(matrix[p][i]))
30                 p=j;
31         if(p!=i)
32             exchange_col(i,p,n);
33         if(matrix[i][i]==0) return false;
34         for(j=i+1; j<n; j++)
35         {
36             r=matrix[j][i]/matrix[i][i];
37             for(k=i; k<=n; k++)
38                 matrix[j][k]-=r*matrix[i][k];
39         }
40     }
41     for(i=n-1; i>=0; i--)
42     {
43         ans[i]=matrix[i][n];
44         for(j=n-1; j>i; j--)
45             ans[i]-=matrix[i][j]*ans[j];
46         if(abs(matrix[i][i])<eps)return false;
47         ans[i]/=matrix[i][i];
48     }
49     return true;
50 }
51 
52 int main()
53 {
54     int d;
55     while(scanf("%d",&d)&&d)
56     {
57         memset(matrix,0,sizeof matrix);
58         for(int i=0; i<=d+2; i++)
59             scanf("%lf",&a[i]);
60         for(int k=0; k<=d+2; k++)
61         {
62             int cnt=0;
63             for(int j=0; j<=d+2; j++)
64             {
65                 if(k==j) continue;
66                 matrix[cnt][d+1]=a[j];
67                 for(int i=0; i<=d; i++)
68                 {
69                     if(i==0) matrix[cnt][i]=1;
70                     else matrix[cnt][i]=matrix[cnt][i-1]*j;
71                 }
72                 cnt++;
73             }
74             if(!gauss(d+2))
75             {
76                 printf("%d\n",k);
77                 break;
78             }
79         }
80     }
81     return 0;
82 }
View Code

 

posted @ 2013-09-08 00:44  Yours1103  阅读(155)  评论(0编辑  收藏  举报