zoukankan      html  css  js  c++  java
  • 高斯消元模板

    【问题描述】
    已知 n 元线性一次方程组。
    a1,1x1+a1,2x2++a1,nxn=b1
    a2,1x1+a2,2x2++a2,nxn=b2
    ………………
    an,1x1+an,2x2++an,nxn=bn
    其中: n<=50.系数是整数,绝对值<=100 , bi的值都是正整数且<300
    编程任务:
    根据输入的数据,编程输出方程组的解的情况。
    【输入】(gaess.in)
    第一行,未知数的个数。以下nn+1列:分别表示每一格方程的系数及方程右边的值。
    n
    a1,1a1,2a1,nb1
    a2,1a2,2a2,nb2
    …………
    an,1an,2an,nbn
    【输出】(gaess.out)
    如果方程组无实数解输出1 ;
    如果有无穷多实数解,输出 0 ;
    如果有唯一解,则输出解(小数点后保留两位小数,如果解是0,则不保留小数)
    【样例输入】
    3
    2 -1 1 1
    4 1 -1 5
    1 1 1 0
    【样例输出】

    x1=1.00

    x2=0

    x3=-1.00

    #include<bits/stdc++.h>
    #define ll long long
    #define DB double
    #define eps 1e-8 
    using namespace std;
    inline int read()
    {
    	int x=0,w=1;char ch=getchar();
    	while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
    	while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    	return x*w;
    }
    const int N=120;
    int n;
    DB a[N][N];
    //-1 无解  0 0 0 9
    //0 多解   右上三角矩阵中不完全为1 
    //1  唯一解
    void debug()
    {
    	for(int i=1;i<=n;++i)
    	{
    		for(int j=1;j<=n+1;++j)
    		 printf("%.2lf ",a[i][j]);
    		printf("
    ");
    	}
    	cout<<"_________________"<<endl;
    }
    int gaosi()
    {
    	for(int i=1;i<=n;++i)
    	{
    		int nw=i; 
    		for(int j=i+1;j<=n;++j)
    		 if(fabs(a[nw][i])<fabs(a[j][i])) nw=j;
    		swap(a[nw],a[i]);
    		if(fabs(a[i][i])<eps) continue;
    		DB h=a[i][i];
    		for(int j=i;j<=n+1;++j) a[i][j]/=h;
    		for(int j=1;j<=n;++j)
    		 if(j!=i)
    		 {
    			DB zz=a[j][i];
    			for(int k=1;k<=n+1;++k) a[j][k]-=zz*a[i][k];
    		 }
    	}
    	//判断解 
    	int opt1=0,opt2=0;
    	for(int i=1;i<=n;i++){
            int j=1;
            while(fabs(a[i][j])<eps&&j<=n+1)j++;
            if(j>n+1) opt1=1;//多解 
            else if(j==n+1)opt2=1;//无解 
        }
        if(opt2) return -1;
    	if(opt1) return 0; 
    	return 1;
    } 
    int main()
    {
    	freopen("gaess.in","r",stdin);
    	freopen("gaess.out","w",stdout); 
        n=read();
        for(int i=1;i<=n;++i)
         for(int j=1;j<=n+1;++j)
          a[i][j]=(DB)read();
        int fg=gaosi();
    //    debug();
        if(fg==-1) cout<<"-1";
        else if(fg==0) cout<<"0";
        else{
        	for(int i=1;i<=n;++i) 
        	if(a[i][n+1]==0)  printf("x%d=%d
    ",i,0);
    		else  printf("x%d=%.2lf
    ",i,a[i][n+1]);
        }
    	return 0;
    }
    

      

  • 相关阅读:
    406. 根据身高重建队列 vector 自定义排序
    5552. 到家的最少跳跃次数 BFS
    5602. 将 x 减到 0 的最小操作数 双指针
    Hadoop Container is running beyond memory limits code143
    1122. 数组的相对排序 自定义排序
    328. 奇偶链表 链表
    127. 单词接龙 bfs
    5600. 第 K 条最小指令 组合数学
    5548. 最小体力消耗路径 二分
    1024. 视频拼接 dp
  • 原文地址:https://www.cnblogs.com/adelalove/p/8609373.html
Copyright © 2011-2022 走看看