要求添精!给点意见!谁能看懂!
[求助] n介线性方程的求解问题.
编程求解n 介线性方程组!
要求:
1.若方程有解请输出其解,
2.若方程无解输出无解原因,
3.若方程有多个解请给出其通解.
4.要有提示信息!
5.程序要有一般性.
6.n的值是要任意输入的而且n>=1.
要求:
1.若方程有解请输出其解,
2.若方程无解输出无解原因,
3.若方程有多个解请给出其通解.
4.要有提示信息!
5.程序要有一般性.
6.n的值是要任意输入的而且n>=1.
程序清单:
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
#define MAX 255
int Guass(double a[],double b[],int n)
{int *js,l,k,i,j,is,p,q;
double d,t;
js=malloc(n*sizeof(int));
l=1;
for(k=0;k<=n-2;k++)
{d=0.0;
for(i=k;i<=n-1;i++)
for(j=k;j<=n-1;j++)
{t=fabs(a[i*n+j]);
if(t>d)
{d=t;js[k]=j;is=i;}
}
if(d+1.0==1.0)l=0;
else {if(js[k]!=k)
for(i=0;i<=n-1;i++)
{p=i*n+k;
q=i*n+js[k];
t=a[p];a[p]=a[q];a[q]=t;}
if(is!=k)
{for(j=k;j<=n-1;j++)
{p=k*n+j;
q=is*n+j;
t=a[p];a[p]=a[q];a[q]=t;}
t=b[k];b[k]=b[is];b[is]=t;}
}
if(l==0){free(js);
printf("该矩阵为奇异矩阵!\n");
return (0);}
d=a[k*n+k];
for(j=k+1;j<=n-1;j++)
{p=k*n+j;
a[p]=a[p]/d;}
b[k]=b[k]/d;
for(i=k+1;i<=n-1;i++)
{for(j=k+1;j<=n-1;j++)
{p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if(fabs(d)+1.0==1.0)
{free(js);
printf("该矩阵为奇异矩阵!\n");
return (0);}
b[n-1]=b[n-1]/d;
for(i=n-2;i>=0;i--)
{t=0.0;
for(j=i+1;j<=n-1;j++)t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;}
js[n-1]=n-1;
for(k=n-1;k>=0;k--)
if(js[k]!=k)
{t=b[k];b[k]=b[js[k]];b[js[k]]=t;}
free(js);
return (1);}
void main()
{int i,n;
double A[MAX],B[MAX];
printf("请输入要求解的齐次线性方程组的介数:n=");
scanf("%d",&n);
printf("请逐个输入%d介齐次线性方程组未知数的系数矩阵共%dX%d个:\n",n,n,n);
for(i=0;i<n*n;i++)
scanf("%lf",&A[i]);
printf("请逐个输入%d介齐次线性方程组右边的常量矩阵共%d个:\n",n,n);
for(i=0;i<n;i++)
scanf("%lf",&B[i]);
if(Guass(A,B,n)!=0)
{printf("要求解的%d介齐次线性方程组的解为:\n",n);
for(i=0;i<n;i++)
printf("X(%d)=%f\n",i+1,B[i]);
}
else printf("要求解的%d介齐次线性方程组无解.\n",n);
}