#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; }
来源:https://www.cnblogs.com/wawcac-blog/p/11956600.html