码迷,mamicode.com
首页 > 其他好文 > 详细

高斯消元学习

时间:2018-02-10 12:54:36      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:eps   break   答案   模拟   tps   http   情况   ios   代码   

高斯消元

Tags:数论

更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1046632


一、概述

两种形式

求解方程组

模拟加减消元,详见代码

异或形式?

二、题目

模板

综合

代码

[hihoCoder]高斯消元·一
给定N个未知数M个方程,要求判无解、无穷解,有唯一解则输出
毒瘤题「题解戳我BY TPLY」

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int N,M;
double f[1011][511];
const double EPS=1e-7;
void Gauss()
{
    int flag=0;
    for(int i=1;i<=N;i++)
    {
        int now=i;
        for(int j=i+1;j<=M;j++)
            if(fabs(f[now][i])<fabs(f[j][i]))
                now=j;
        if(now!=i)swap(f[now],f[i]);//在这里这一段不能省,当这一行为0时有可能这个式子是无效的所以换一个式子上来
        if(fabs(f[i][i])<EPS){flag=1;continue;}//从i到M这些式子x[i]的系数都是0,那么如果x[i+1]-x[N]都有解的话,x[i]就有无穷解了,注意无解情况优先于无穷解
        for(int j=i+1;j<=N+1;j++)f[i][j]/=f[i][i];f[i][i]=1;
        for(int j=i+1;j<=M;j++)
        {
            for(int k=i+1;k<=N+1;k++)
                f[j][k]-=f[j][i]*f[i][k];
            f[j][i]=0;
        }
        //正常的消元
    }
    //判无解1:系数全0,常数非0
    for(int j,i=1;i<=M;i++)
    {
        for(j=1;j<=N;j++)
            if(fabs(f[i][j])>EPS)break;
        if(j==N+1&&fabs(f[i][N+1])>EPS){printf("No solutions\n");return;}//有一项方程系数都为0但是常数项大于0于是方程无解
    }
    //判无解2:计算第i行答案时出现a*x[i]=C(a=0,C!=0)
    for(int i=N;i>=1;i--)
    {
        for(int j=i+1;j<=N;j++)f[i][N+1]-=f[i][j]*f[j][N+1];
        if(f[i][N+1]&&!f[i][i]){printf("No solutions\n");return;}
    }
    if(flag){printf("Many solutions\n");return;}
    for(int i=1;i<=N;i++)
        printf("%d\n",int(f[i][N+1]+0.5));
}
int main()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
        for(int j=1;j<=N+1;j++)
            scanf("%lf",&f[i][j]);
    Gauss();return 0;
}

高斯消元学习

标签:eps   break   答案   模拟   tps   http   情况   ios   代码   

原文地址:https://www.cnblogs.com/xzyxzy/p/8438387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!