zoukankan      html  css  js  c++  java
  • 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
    ",k);
    77                 break;
    78             }
    79         }
    80     }
    81     return 0;
    82 }
    View Code
  • 相关阅读:
    常用Js笔记,以后可能用得上
    基于Nop增删改查代码模板
    使用Layer Confirm弹窗没有点击确定按钮就执行了确定方法
    页面表单传值
    2018年5月2日 问题记录
    循环分页请求
    git删除commit方法和误删commit后的恢复方法
    git切换分支
    系统化的思考模式
    实践!实现纯前端下的音频剪辑处理
  • 原文地址:https://www.cnblogs.com/yours1103/p/3308013.html
Copyright © 2011-2022 走看看