#include<stdio.h>
#define M 20
#define N 21
int k,l;
void main()
{
int i,i1,i2,i3,j,j1,j2,m,n,n1,min,min1,imax,*p,(*q)[N],a[M][N];
char c;
do
{
printf("请输入方程个数,不大于20个:");
scanf("%d",&k);
if(k>M)
printf("error!");
}
while(k>M);//如果大于20则重新输入
do
{
printf("请输入未知数个数,不大于20个:");
scanf("%d",&l);
if(l>N-1)
printf("error!");
}
while(l>N-1);//如果大于20则重新输入
for(i=0;i<k;i++)
{
printf("请输入第%d个方程系数包括等号右边的常数按下回车键进入下一步(必须是整数且各方程的第一个系数为正整数)\n请输入",i+1);
for(j=0;j<l;j++)
{
printf("第%d个未知数系数:",j+1);
scanf("%d",&a[i][j]);
}
if(j==l)
{
printf("请输入第%d个方程等号右边的常数:",i+1);
scanf("%d",&a[i][j]);
}
p=&a[0][0];
q=a;
}
p=&a[0][0];
q=a;
for(i=0;i<k;i++,q++)
{
for(j=0,p=*q;j<=l;j++,p++)
printf("%d ",*p);
printf("\n");
}
printf("下一步:\n");
for(i=0;i<k;i++)//将方程按照首系数的降序排列
{
m=a[i][0];
for(i1=i;i1<k;i1++)//交换第一未知数系数
if(a[i1][0]>m)
{
m=a[i1][0];
a[i1][0]=a[i][0];
a[i][0]=m;
for(j=1;j<=l;j++)//交换其他系数
{
n=a[i1][j];
a[i1][j]=a[i][j];
明解c语言 a[i][j]=n;
}
}
}
for(i2=0;i2<k;i2++)//化简为最简方程
{
imax=1;//初始化imax
for(i3=1,min=2;i3<=min;i3++)//min=2是为了保证第一次执行
{
for(j2=0;j2<=l;j2++)//寻不为零的系数
if(a[i2][j2]!=0)
{
min=a[i2][j2];
break;
}
if(j2>l)//如果所有系数都为零
min=1;
else
{
for(j2=0;j2<=l;j2++)//到绝对值最小的系数(零除外)
{
if(a[i2][j2]<0)
min1=-a[i2][j2];
else min1=a[i2][j2];
if(min1<min&&min1!=0)
min=min1;
}
for(j2=0,n1=0;j2<=l&&n1==0;j2++)//到最大公约数
{
n1=a[i2][j2]%i3;
if(n1==0&&j2==l)
imax=i3;
}
}
if(i3>=min/2&&i3!=min)//减少循环次数
i3=min-1;
}
for(j2=0;j2<=l;j2++)//除以最大公约数
a[i2][j2]/=imax;
}
p=&a[0][0];
q=a;
for(i=0;i<k;i++,q++)
{
for(j=0,p=*q;j<=l;j++,p++)
printf("%d ",*p);
printf("\n");
}
printf("下一步:\n");
for(i=0;i<k;i++)//矩阵上三角化
{
for(i1=i+1;i1<k;i1++)
if(a[i1][i]!=0)
{
for(j=0,m=a[i][i],n=a[i1][i];j<=l;j++)
a[i1][j]=a[i1][j]*m-a[i][j]*n;
for(i2=0;i2<k;i2++)//化简为最简方程
{
imax=1;//初始化imax
for(i3=1,min=2;i3<=min;i3++)//min=2是为了保证第一次执行
{
for(j2=0;j2<=l;j2++)//寻不为零的系数
if(a[i2][j2]!=0)
{
min=a[i2][j2];
break;
}
if(j2>l)//如果所有系数都为零
min=1;
else
{
for(j2=0;j2<=l;j2++)//到绝对值最小的系数(零除外)
{
if(a[i2][j2]<0)
min1=-a[i2][j2];
else min1=a[i2][j2];
if(min1<min&&min1!=0)
min=min1;
}
for(j2=0,n1=0;j2<=l&&n1==0;j2++)//到最大公约数
{
n1=a[i2][j2]%i3;
if(n1==0&&j2==l)
imax=i3;
}
}
if(i3>=min/2&&i3!=min)//减少循环次数
i3=min-1;
}
for(j2=0;j2<=l;j2++)//除以最大公约数
a[i2][j2]/=imax;
}
}
}
p=&a[0][0];
q=a;
for(i=0;i<k;i++,q++)
{
for(j=0,p=*q;j<=l;j++,p++)
printf("%d ",*p);
printf("\n");
}
printf("下一步正在计算,请稍后…………\n");
for(i=k-1;i>0;i--)//将非零行首非零元素上面的化为零
for(j=l-1;j>0;j--)
if(a[i][j]!=0)
for(i1=i-1;i1>=0;i1--)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论