#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小时内删除。