cogs 721. [SDOI2007] 线性方程组

721. [SDOI2007] 线性方程组

★★   输入文件:gaess.in   输出文件:gaess.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】
已知 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

2017/03/22新加3组数据 by rapiz

/*高斯消元求解线性方程组*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
#define N 100
#define eps (1e-8)
int n;double a[N][N];
int main(){
    freopen("gaess.in", "r", stdin);
    freopen("gaess.out", "w", stdout);
    //freopen("cola.txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
    for(int i=1;i<=n;i++){
        int p=i;
        for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[p][i]))p=j;
        for(int j=1;j<=n+1;j++)swap(a[p][j],a[i][j]);
        if(fabs(a[i][i])<eps)continue;
        double tmp=a[i][i];
        for(int j=1;j<=n+1;j++)a[i][j]/=tmp;
        for(int j=1;j<=n;j++)
            if(i!=j){
                double tmp=a[j][i];
                for(int k=1;k<=n+1;k++)a[j][k]-=a[i][k]*tmp;
            }
    }
    int imp=0,ult=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)ult=1;
        else if(j==n+1)imp=1;
    }
    if(imp){printf("-1");return 0;}
    if(ult){printf("0");return 0;}
    for(int i=1;i<=n;i++){
        if(fabs(a[i][n+1])<eps)printf("x%d=0
",i);
        else printf("x%d=%.2lf
",i,a[i][n+1]);
    }
}
原文地址:https://www.cnblogs.com/thmyl/p/6940841.html