高斯列主元消去法--为什么换行没有成功,但是能得到正确答案
#include<stdio.h>#include<math.h>
int main(void)
{
double a[50][50],x[50],temp,sum,s;
int i,j,k,r,n;
printf("请输入线性方程组的系数:\n");
scanf("%d",&n);
printf("请输入线性方程组的元素值:\n");
for(i=0;i<n;i++)
{
for(j=0;j<=n;j++)
scanf("%lf",&a[i][j]);
}
printf("刚才输入的矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<=n;j++)
{
printf("%10lf",a[i][j]);
}
printf("\n");
}
k=0;
do
{
r=k;
for(i=k;i<n;i++)
{
if(fabs(a[r][k])<fabs(a[i][k]))/*先进行比较,看看第一行第一列的元素是否比后面的大,行变化,列不变*/
r=i;/*如果第一行,第一列的元素已经是最大的则不用交换,r=i*/
if(r>k)/*将第一行和后面的行交换,a[r][j]通过temp和a[k][j]交换*/
for(j=k;j<=n;j++)
{
temp=a[r][j];
a[r][j]=a[k][j];
a[k][j]=temp;
}
}/*交换成功,接下来进行计算*/
for(i=k+1;i<n;i++)
{
s=a[i][k]/a[k][k];
for(j=k;j<=n;j++)
{
a[i][j]=a[i][j]-s*a[k][j];
}
}
k++;
}
while(k<n-1);/*循环结束条件*/
printf("输出计算后的矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<=n;j++)
{
printf("%10lf",a[i][j]);
}
printf("\n");
}
for(k=n-1;k>=0;k--)
{
sum=0;
for(j=k+1;j<n;j++)
sum+=a[k][j]*x[j];
x[k]=(a[k][n]-sum)/a[k][k];
}
for(k=0;k<n;k++)
printf("x[%d]=%lf\n",k,x[k]);
return 0;
}