高斯消元解线性方程组的小东西

#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int n;
bool needDebug;
double m[1005][1005]={0};
double x[1005]={0};

void input()
{
    printf("请输入系数矩阵的阶数(1~1000)\n");
    scanf("%d",&n);
    printf("请按行优先顺序输入增广矩阵(用空格、缩进或回车分割每个数字)\n");
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n+1;j++)
            scanf("%lf",&m[i][j]);
    printf("是否输出中间过程的增广矩阵?是请输入y\n");
    char cc[2];
    scanf("%s",cc);
    if(cc[0]=='y') needDebug=1;
    else needDebug=0;
}

void debug()
{
    if(!needDebug) return;
    printf("**********************\n");
    for(int i=1;i<=n;i++,printf("\n"))
        for(int j=1;j<=n+1;j++)
            printf("%24.20lf",m[i][j]);
    printf("**********************\n");
}

inline void rowSwap(int i,int j)
{
    for(int k=1;k<=n+1;k++) std::swap(m[i][k],m[j][k]);
}

int select(int i)
{
    int mxrow=i;
    for(int k=i+1;k<=n;k++)
    {
        if(m[k][i]>m[i][i])
            mxrow=k;
    }
    rowSwap(i,mxrow);
    if(fabs(m[i][i])<1e-10)
    {
        printf("无唯一解\n");
        return 0;
    }
    return 1;
}

int inline gauss()
{
    for(int i=1;i<=n;i++)
    {
        if(!select(i)) return 0;
        for(int j=i+1;j<=n;j++)
        {
            if(fabs(m[j][i])<1e-10) continue;
            double k=m[j][i]/m[i][i];
            for(int h=i;h<=n+1;h++)
            {
                m[j][h]-=m[i][h]*k;
            }
            debug();
        }
    }
    for(int i=n;i;i--)
    {
        x[i]=m[i][n+1]/m[i][i];
        for(int j=i-1;j;j--)
        {
            m[j][n+1]-=x[i]*m[j][i];
            m[j][i]=0;
        }
    }
    return 1;
}

void output()
{
    for(int i=1;i<=n;i++) printf("x_{%d}\t=\t%.2lf\n",i,x[i]);
}

int main()
{
    //freopen("test.in","r",stdin);
    while(1)
    {
        input();
        if(gauss())
            output();
        puts("退出请点击右上角X");
    }
    return 0;
}
posted @ 2019-11-29 11:18  wawcac  阅读(...)  评论(...编辑  收藏